【问题标题】:Sql query with the current datesql查询当前日期
【发布时间】:2012-03-05 16:27:12
【问题描述】:

我有一个简单的查询,我想把当前日期放在哪里

var query = @"
    SELECT trainid, trainnum
    FROM trains 
    WHERE CONVERT(varchar(10), trainstartdate, 104)=" + 
    " " + 
    // so that matches the '104' format
    String.Format("{0:dd.MM.YYYY}", DateTime.Now) +                          
    " " +
    "ORDER BY trainnum";

但在运行时我收到错误消息:

Cannot call methods on numeric. .Net SqlClient Data Provider

如何正确指定当前日期? 谢谢!

使用 GETDATE()

效果: The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

使用 {0:dd.MM.yyyy}

效果:none

使用 CONVERT(varchar(20), GetDate(), 104)

效果:that works!

谢谢!

【问题讨论】:

  • 你应该使用 SqlParametersSqlDbType.DateTime 来代替。
  • 我的回答有什么问题?我只是想知道变得更好。
  • @dknaack 看看我的编辑 (Using GETDATE)。就我而言,如果我只使用普通的GetDate() 调用,那么我会收到错误消息。相反,GETDATE() 的结果应转换为格式“104”。
  • @helicera 请查看我的更新答案并比较性能。

标签: c# sql sql-server-2008 datetime


【解决方案1】:

说明

我不会转换为 varchar 并进行字符串比较。如果您使用>=< 比较trainstartdate,性能会好得多。

您可以使用T-SQL getDate() 方法获取当前日期。

getDate() 返回当前日期时间和时间。 2012-02-14 14:51:08.350

DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 仅返回当前日期。 `2012-02-14 00:00:00.000

DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())) 只返回明天的日期。 2012-02-15 00:00:00.000

样本

var query = @"
SELECT trainid, trainnum
FROM trains 
WHERE trainstartdate >=
-- today
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
AND trainstartdate < 
-- tommorow
DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE()))
ORDER BY trainnum"

注意: 如果您想符合 ANSI,CURRENT_TIMESTAMP 也是如此。

更多信息

【讨论】:

  • +1 - 还避免了在 OP 查询中强制进行表扫描的可怕的 stronc 比较。
  • +1。此外,如果您想符合 ANSI,CURRENT_TIMESTAMP 的作用相同 stackoverflow.com/questions/186572/…
  • @nonnb 不错!我的答案被延长了。
  • -1 这给出了与 OP 的尝试不同的结果:而不是当前日期的行,它给出了 trainstartdate 现在所在的行。
  • @Joe 好评!我的答案已更新。最好的解决方案是不要转换为 varchar。使用between 语句将提供最佳性能。试试吧。谢谢!
【解决方案2】:
var query = @"
SELECT trainid, trainnum
FROM trains 
WHERE CONVERT(varchar(10), trainstartdate, 104)=
CONVERT(varchar(20), GetDate(), 104)
ORDER BY trainnum";

【讨论】:

  • 这两个查询不等价。第一个返回开始日期是今天某个时间的行;第二个返回开始日期为现在的行(当前日期+一天中的时间)。
  • @Joe 这是真的。我删除了第二个查询。
【解决方案3】:

GETDATE() 就是你所需要的...

【讨论】:

    【解决方案4】:

    我觉得

    String.Format("{0:dd.MM.YYYY}", DateTime.Now);
    

    返回带有点的日期,这使得 SQL 将其视为数字。

    尝试使用

    String.Format("{0:MM/dd/yyyy}", DateTime.Now);
    

    改为/

    【讨论】:

      【解决方案5】:

      将YYYY的格式改为小写字母

      {0:dd.MM.yyyy}
      

      【讨论】:

        【解决方案6】:

        您需要注意 GETDATE() 返回当前日期和时间,而不仅仅是今天的日期。

        如果要返回匹配今天日期的行,则需要提取日期部分。有很多方法可以做到这一点 - 例如对于 SQL Server 2008,您可以使用 DATE 数据类型,但适用于 SQL Server 早期版本的一种通用方法如下:

        CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )
        

        然后您可以使用查询:

        SELECT trainid, trainnum   
        FROM trains    
        WHERE trainstartdate = CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )
        

        只要您确定 trains.trainstartdate 列中的日期/时间只是一个日期(一天中的时间 = 0),这将起作用。

        如果 trainstartdate 包含开始日期/时间,您可以获得今天的所有火车,如下所示:

        SELECT trainid, trainnum   
        FROM trains    
        WHERE trainstartdate >= CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) )
        AND trainstartdate < DATEADD(dd,1, CONVERT(DATETIME, convert(VARCHAR(10),getdate(),101) ))
        

        通过这样做而不是转换为字符串,您将利用 trainstartdate 列上可能存在的任何索引。

        【讨论】:

          【解决方案7】:

          试试这个.. YYYY应该是小写字母yyyy

          String.Format("{0:dd.MM.yyyy}", DateTime.Now)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-19
            • 1970-01-01
            相关资源
            最近更新 更多