You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:13:31