SQL Server:将datetime day与GETDATE()进行比较
我有一个存储过程,它应该获取日期等于当前日期或将来日期的所有记录。 日期保存在targetDate列中,格式为datetime。 我对应的WHERE子句如下所示:SQL Server:将datetime day与GETDATE()进行比较,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,我有一个存储过程,它应该获取日期等于当前日期或将来日期的所有记录。 日期保存在targetDate列中,格式为datetime。 我对应的WHERE子句如下所示: WHERE A.targetDate >= GETDATE() 一般来说,我的存储过程工作正常,唯一的问题是如果targetDate等于当前日期,因为所有日期都按如下方式保存,即时间设置为零: 2014-02-22 00:00:00.000 如何更改WHERE子句,使其只考虑日期,而忽略随日期一起保存的时间,以便即使时间已过
WHERE A.targetDate >= GETDATE()
一般来说,我的存储过程工作正常,唯一的问题是如果targetDate等于当前日期,因为所有日期都按如下方式保存,即时间设置为零:
2014-02-22 00:00:00.000
如何更改WHERE子句,使其只考虑日期,而忽略随日期一起保存的时间,以便即使时间已过,也能获得具有当前日期的任何记录
非常感谢您在这方面的帮助,Tim。以下内容将立即为您提供当前日期:
SELECT DATEADD(dd,0,DATEDIFF(dd,0,GETDATE()))
这应该是您的最后一行:
WHERE A.targetDate >= DATEADD(dd,0, ATEDIFF(dd,0,GETDATE()))
改为:
WHERE A.targetDate >= cast(GETDATE() as date)
编辑-因为targetdate也包含时间,所以是,格式如下:
WHERE cast(A.targetDate as date) >= cast(GETDATE() as date)
编辑-有关性能的给定注释,可能要尝试:
WHERE a.targetdate >= cast(cast(getdate() as date) as datetime)
最后一次编辑应该会给出相同的结果,并利用targetdate上的任何索引您有哪个版本的sql server?我有sql server 2008版谢谢-这对我不起作用。我是否也必须格式化targetDate?如果是日期字段,则不必格式化。它是一个时间戳还是一个日期字段?它是一个日期时间字段,但输入总是一个日期,这就是为什么它会像上面的例子那样为时间添加零。没有必要将
targetDate
强制转换为date
。将字段包装在强制转换()中使其不可搜索。换句话说,它破坏了使用索引的能力,并导致全表扫描。在这种情况下,如果该字段已经是日期-时间数据类型,则不需要该字段(在比较=a_date
时不需要删除时间组件)。使用第二个SELECT
是语法错误。不需要子查询,因此只需删除选择
。并更改DATEDIFF
的ATEDIFF
;)非常感谢。这是上面一行的复制/粘贴错误;我修好了。