SQL查询判断当前时间不在19:00-次日02:00区间凌晨失效原因
问题原因分析
你这段SQL失效的核心原因是把时间转成字符串后用BETWEEN做比较,而字符串是按字典序判断大小的。
具体细节:
BETWEEN '19:00:00' AND '02:00:00'在字符串比较逻辑里,'19:00:00'的字典序比'02:00:00'大,这个区间本身是无效的——没有任何字符串会同时满足大于等于'19:00:00'且小于等于'02:00:00'。- 因此
NOT BETWEEN会永远返回TRUE,不管当前时间是00:00-02:00还是其他时段,都会执行print 'a',完全达不到你想要排除特定时间段的目的。
如果要实现正确逻辑,应该直接基于时间类型判断,不要转成字符串。比如两种可行写法:
-- 方法1:提取小时判断 DECLARE @currentTime TIME = GETDATE() IF NOT (DATEPART(HOUR, @currentTime) >= 19 OR DATEPART(HOUR, @currentTime) < 2) BEGIN PRINT 'a' END
-- 方法2:直接用时间范围判断 DECLARE @currentTime TIME = GETDATE() IF NOT (@currentTime >= '19:00:00' OR @currentTime <= '02:00:00') BEGIN PRINT 'a' END
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

