我正在使用 DATEDIFF 来确保某个操作每分钟不会发生超过一次。
SELECT COUNT(*)
FROM FOOD_ACTION
WHERE
DATEDIFF(MINUTE,INSERT_DT,GETDATE()) <= 1
Run Code Online (Sandbox Code Playgroud)
INSERT_DT
GETDATE()
是与返回格式相同的日期列
如果此查询返回任何内容,则不允许发生该操作。
问题是,它只是有效的。我的时间范围从一分十秒一直到近两分钟,然后才会让该动作再次发生。如果它接近一两分钟,似乎没有任何一致性,并且我已经确认GETDATE()
返回的时间与我的应用程序设置列时返回的时间相同INSERT_DT
。
不一致和不正确的时间是怎么回事?
当您执行 datediff 时,T-SQL 将查找时间/日期部分边界何时交叉以增加差异。
所以:
DECLARE @StartDate DATETIME = '2000-01-01T12:51:59.999',
@EndDate DATETIME = '2000-01-01T12:52:00:000'
SELECT DATEDIFF(minute, @StartDate, @EndDate)
Run Code Online (Sandbox Code Playgroud)
即使日期之间只有 1 毫秒的差异,您也会得到结果: 1 。
在实践中,我通过降低粒度并寻找与我自己的交叉来解决这个问题,即:
DECLARE @StartDate DATETIME = '2000-01-01T12:51:59.999',
@EndDate DATETIME = '2000-01-01T12:52:00:000'
SELECT
CASE WHEN DATEDIFF(second, @StartDate, @EndDate) >= 59 THEN CAST(1 as bit)
ELSE CAST(0 as bit)
END as InNewMinute
Run Code Online (Sandbox Code Playgroud)
这将给出 0,因为显然 1 毫秒不是 1 分钟的差异。
注意:上面的代码显然只是为了处理1分钟的差异
请参阅:MSDN DATEDIFF (Transact-SQL)(查看 datePart 边界)