不是一个sql程序员。它在我看来它正在寻找今天exch_date的任何东西并删除它。这是对的吗?
DELETE FROM dbo.Table where
DATEADD(dd, DATEDIFF(dd,0,exch_Date),0) = DATEADD(dd, DATEDIFF(dd,0,GETDATE()),0)
答案 0 :(得分:5)
验证这一点的一种方法是将其输入到select语句中。这将帮助您识别将受影响的所有行。
Select * from db.table
where DATEADD(dd, DATEDIFF(dd,0,exch_Date), 0)
= DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
答案 1 :(得分:3)
它似乎在exch_Date和当前日期之间进行了一整天(如无时间组件)比较。
答案 2 :(得分:1)
这就是它正在做的事情。这是将日期视为数字的另一种方式,而不是使用日期操作函数:
DELETE FROM dbo.Table WHERE
CAST( CAST(exch_Date as float) as int ) = CAST( CAST(getdate() as float) as int )
注意:我最初有这个:
DELETE FROM dbo.Table WHERE
CAST( exch_Date as int ) = CAST( getdate() as int )
但正如Andriy在评论中所指出的那样,这将围绕下一个中午,而不是简单地将日期截断为整数。通过首先进行浮点转换,整数转换符合预期。 Andriy减去0.5的解决方案也很好,虽然我更喜欢稍微冗长的浮动版本,这可以避免任何潜在的魔法数字混乱。
答案 3 :(得分:1)
如果您使用的是SQL Server 2008,那么到目前为止最好的解决方案是CAST到目前为止,它仍然是SARGable(可以使用索引)
DELETE db.table
where CAST(exch_Date as Date) = DATEDIFF(dd,0,GETDATE())
DateAdd to 0
部分是冗余(无关)代码。
在SQL Server 2008之前,出于性能原因,最好在一个范围内测试日期/时间列,而不是在其上使用函数导致表扫描。
DELETE db.table
where exch_Date >= DATEDIFF(dd,0,GETDATE())
and exch_Date < DATEDIFF(dd,0,GETDATE()) +1