SQL Server 2016中基于时间值提取记录的查询修正问题
问题原因
原查询无法匹配夜班(ID=3)的核心原因是BETWEEN运算符的逻辑限制:它要求左边界值小于等于右边界值。但夜班的OraInizio(19:00:01)大于OraFine(05:59:59),跨午夜的时间范围无法被BETWEEN正确识别——00:30无法同时满足>=19:00:01和<=05:59:59,因此该时段不会被选中。
修正后的查询
DECLARE @DATA AS DATETIME = '11-09-2023 00:30:00'; DECLARE @TargetTime AS TIME = CONVERT(TIME, @DATA); SELECT * FROM TIMETABLE WHERE -- 常规时段:开始时间≤结束时间,使用BETWEEN匹配 (OraInizio <= OraFine AND @TargetTime BETWEEN OraInizio AND OraFine) OR -- 跨午夜时段:开始时间>结束时间,匹配「开始到午夜」或「午夜到结束」 (OraInizio > OraFine AND (@TargetTime >= OraInizio OR @TargetTime <= OraFine));
逻辑说明
- 先提取目标时间的纯时间部分,减少重复转换操作。
- 针对跨午夜的夜班,只要目标时间晚于19:00:01(当日夜间)或早于05:59:59(次日凌晨),就会触发匹配,00:30因此能正确命中ID=3的记录。
内容的提问来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

