2014-02-22 450 views
7

我有一个存储过程,应该获取日期等于当前日期或将来的所有记录。 日期保存在targetDate列中,并格式化为日期时间。 我相应的WHERE子句如下:SQL Server:使用GETDATE()比较datetime日期()

WHERE A.targetDate >= GETDATE() 

一般来说我的存储过程能正常工作,我唯一的问题是,如果targetDate等于当前日期的所有日期与设置为零的时间保存如下,即:

2014-02-22 00:00:00.000 

怎么办我必须改变我的WHERE子句,这样只考虑日期,但忽略了保存它,这样我得到任何记录,同时,即使在时间已过当前日期时间?非常感谢任何帮助,Tim。

+0

采取任何指标优势的SQL Server版本,有? –

+0

我有SQL Server版本2008 – user2571510

回答

20

更改为:

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

+0

谢谢 - 这对我不起作用。我还必须格式化targetDate吗? – user2571510

+1

如果它是日期字段,则不是。它是时间戳还是日期字段? –

+0

这是一个日期时间字段,但输入始终只是一个日期,这就是为什么它像上面的示例中那样添加零的原因。 – user2571510

2

下应该给你当前的日期,没有时间:

SELECT DATEADD(dd,0,DATEDIFF(dd,0,GETDATE())) 

这应该是你的最后一行:

WHERE A.targetDate >= DATEADD(dd,0, ATEDIFF(dd,0,GETDATE())) 
+1

使用第二个'SELECT'是一个语法错误。不需要子查询,只需删除'SELECT'即可。并将'ATEDIFF'换成'DATEDIFF'; – MatBailie

+0

谢谢。这是上面一行中的复制/粘贴错误;我修好了它。 – Preli