在SQL中比较日期时间和午夜的有效方法

3

我希望从 SQL Server 数据表中选择一个日期时间字段在当前日期凌晨之后的记录。

目前我使用这个方法,但还想请问是否有更有效率的方式?

 WHERE start_time > (Select DATEADD(d,0,DATEDIFF(d,0,GETDATE())))

1
至少更易读:WHERE start_time > DATEADD(d,0,DATEDIFF(d,0,GETDATE())) - jarlh
你正在使用哪个版本的SQL Server? - K Richard
3
有许多种方法可以实现这个功能。也许可以这样写: WHERE start_time > cast(getdate() as date) - Sean
2个回答

5

如果你将当前日期转换或转型为日期而不是日期时间,我相信你可以在WHERE语句中使用它,因为日期数据类型被设置为午夜:

WHERE start_time > CONVERT(date, GETDATE())

或者

WHERE start_time > CAST(GETDATE() AS date)

只要您运行的是 SQL Server 2008 或更高版本,SQL Server 2005 就没有 date 数据类型。 - S. Rojak
感谢回复,我需要保持日期时间格式,因为我必须在应用程序中的某个点比较确切的开始时间。仅仅将其更改为DATEADD(d,0,DATEDIFF(d,0,GETDATE()))已经减少了几秒钟 - 这是一个大型联合查询。 - DarkW1nter
3
如果你将字段设置为 datetime 类型,只有在一个实例中将 getdate() 转换为 date 类型。如果你使用这种方法,使用字段作为 datetime 类型不应该会产生下游问题。请注意,不要改变原文的含义。 - K Richard

0
这里有几种方法。SQL Server 2012添加了一些函数以从部分中组合日期,但在早期版本中也可以实现。
DECLARE
@dt_now date = GETDATE();

-- requires SQL Server 2012 or later
SELECT DATETIMEFROMPARTS(YEAR(@dt_now), MONTH(@dt_now), DAY(@dt_now), 0, 0, 0, 0);

-- available for SQL Server 2005 or later
SELECT CONVERT(datetime, CAST(MONTH(@dt_now) AS varchar) + '/'
                    + CAST(DAY(@dt_now) AS varchar) + '/'
                    + CAST(YEAR(@dt_now) AS varchar), 101);

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