SQL查询求助:筛选全月16:00至次日06:59进入IVR的通话
解决跨天时段的SQL筛选问题
我来帮你排查这个问题——你的SQL用BETWEEN的方式其实误解了需求的时间范围逻辑,咱们一步步来解决:
为什么原语句会返回全时段记录?
你想用BETWEEN '2018-01-01 16:00:00' AND '2018-01-31 06:59:59'来筛选,但BETWEEN是连续的时间区间判断,它会包含所有在「2018-01-01 16:00」到「2018-01-31 06:59」之间的时间——这就意味着1月2日07:00到15:59的记录也会被包含进来(因为这些时间确实在你指定的首尾时间范围内),但这显然不是你要的「每天16:00之后至次日06:59」的时段。
正确的解决方案
你需要的是每天的两个时间片段:当天16:00到23:59,以及次日00:00到06:59。我们可以通过提取时间部分来判断,同时限定日期在1月范围内:
SELECT [conversationId], [conversationStart] FROM [Customer].[dbo].[vw_Conversations] WHERE -- 确保通话日期在2018年1月全月 CONVERT(DATE, conversationStart) BETWEEN '2018-01-01' AND '2018-01-31' -- 匹配符合要求的时段:16点及以后,或者6点59分及以前 AND (CAST(conversationStart AS TIME) >= '16:00:00' OR CAST(conversationStart AS TIME) <= '06:59:59')
语句逻辑说明
CONVERT(DATE, conversationStart)提取通话的日期部分,确保只筛选1月的记录;CAST(conversationStart AS TIME)提取通话的时间部分,判断是否属于「16:00之后」或者「06:59之前」——这正好覆盖了你需要的跨天时段。
你可以测试几条记录验证:比如1月2日08:00的记录会被排除,而1月2日17:00、1月3日06:00的记录会被正确返回。
内容的提问来源于stack exchange,提问作者Hussein ALSHAMIRI
相关产品推荐
相关产品推荐

