使用当前日期的 SQL 查询

4
我有一个简单的查询,想要插入当前日期。
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";

但在运行时,我收到以下错误信息: 无法在数字上调用方法。.Net SqlClient数据提供程序 我该如何正确指定当前日期? 谢谢! 使用GETDATE() 效果: 将varchar数据类型转换为datetime数据类型时出现超出范围的值 使用{0:dd.MM.yyyy} 效果: 使用CONVERT(varchar(20), GetDate(), 104) 效果:可以正常工作! 谢谢!

你应该使用 SqlDbType.DateTimeSqlParameters - Tim Schmelter
我的回答哪里出了问题?我只是想知道如何变得更好。 - dknaack
@dknaack 看看我的编辑(使用GETDATE)。在我的情况下,如果我只使用普通的 GetDate() 调用,则会出现错误消息。相反,应将 GETDATE() 的结果转换为格式“104”。 - lexeme
@helicera,请查看我的更新答案并比较性能。 - dknaack
7个回答

9

描述

不要将其转换为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
+1 - 这也避免了强制在 OP 查询中进行表扫描的可怕的 stronc 比较。 - TomTom
1
+1。如果您想符合ANSI标准,CURRENT_TIMESTAMP也可以实现相同的功能。https://dev59.com/gXVC5IYBdhLWcg3wykQt - StuartLC
@nonnb 很好!我的答案已经扩展了。 - dknaack
-1 这与 OP 的尝试产生了不同的结果:它不是给出当前日期的行,而是给出其 trainstartdate 正好是现在的行。 - Joe
@Joe 很好的评论!我的答案已经更新了。最好的解决方案不是转换为 varchar。使用 between 语句将会提供最佳性能。试试看吧。谢谢! - dknaack
显示剩余2条评论

2
var query = @"
SELECT trainid, trainnum
FROM trains 
WHERE CONVERT(varchar(10), trainstartdate, 104)=
CONVERT(varchar(20), GetDate(), 104)
ORDER BY trainnum";

这两个查询不等价。第一个返回开始日期在今天某个时间的行;第二个返回开始日期为现在(当前日期+时间)。 - Joe
@Joe 是的,我删除了第二个查询。 - Dennis Traub

2

2

我认为

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

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

尝试使用

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

/替换为斜杠。


1

将YYYY的格式模式更改为小写字母

{0:dd.MM.yyyy}

1

你需要知道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列上可能存在的任何索引。

0

试试这个.. YYYY 应该改成小写的 yyyy

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接