DATEDIFF 检查一分钟实际上在一到两分钟之间

iMa*_*kre 1 t-sql sql-server

我正在使用 DATEDIFF 来确保某个操作每分钟不会发生超过一次。

SELECT COUNT(*) 
FROM FOOD_ACTION
WHERE 
DATEDIFF(MINUTE,INSERT_DT,GETDATE()) <= 1
Run Code Online (Sandbox Code Playgroud)

INSERT_DTGETDATE()是与返回格式相同的日期列

如果此查询返回任何内容,则不允许发生该操作。

问题是,它只是有效的。我的时间范围从一分十秒一直到近两分钟,然后才会让该动作再次发生。如果它接近一两分钟,似乎没有任何一致性,并且我已经确认GETDATE()返回的时间与我的应用程序设置列时返回的时间相同INSERT_DT

不一致和不正确的时间是怎么回事?

And*_*ton 5

当您执行 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 边界)