【问题标题】:How do I query time data type with between 2 times varying over midnight如何在午夜查询 2 次之间变化的时间数据类型
【发布时间】:2017-01-27 22:12:25
【问题描述】:

如何查询在午夜变化 2 次的时间数据类型。 这是我尝试过的。

声明@timeValue 时间
SET @timeValue = '23:30:00'

选择@timeValue,DATEADD(分钟,-30,@timeValue),DATEADD(分钟,+30,@timeValue)
WHERE @timeValue BETWEEN DATEADD(minute, -30, @timeValue) AND DATEADD(minute, +30, @timeValue)

但是如果我们以上面的例子来查找时间是否在前后 30 分钟之间有效,并且它会在午夜发生变化。我没有得到预期的结果。

预期结果将是 timeValue 变量中具有值的行以及其他列之前和之后的 30 分钟。

但是,如果我使用没有像下面这样跨越午夜的时间,它可以正常工作。

声明@timeValue 时间
SET @timeValue = '23:00:00'

选择@timeValue,DATEADD(分钟,-30,@timeValue),DATEADD(分钟,+30,@timeValue)
WHERE @timeValue BETWEEN DATEADD(minute, -30, @timeValue) AND DATEADD(minute, +30, @timeValue)

我得到了预期的以下响应。


23:00:00.0000000 22:30:00.0000000 23:30:00.0000000

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是因为TIME 数据类型没有日期组件。您将需要使用DATETIME 或具有时间组件的其他日期日期类型之一。如果没有日期,您的时间不在这 2 次之间。

    declare @timeValue DATETIME
    SET @timeValue = '23:30:00'
    
    SELECT @timeValue,DATEADD(minute, -30, @timeValue),DATEADD(minute, +30, @timeValue)
    WHERE @timeValue BETWEEN DATEADD(minute, -30, @timeValue) AND DATEADD(minute, +30, @timeValue)
    

    【讨论】:

    • 有效答案马特.. 感谢您的回复。
    【解决方案2】:

    你的时间在午夜结束。换句话说:23:30 + 00:30 = 00:00 小于 23:30。不满足条件23:00 < 23:30 < 00:00。解决方法是将参数转换为日期时间:

    declare @timeValue time
    SET @timeValue = '23:30:00'
    
    SELECT @timeValue,DATEADD(minute, -30, @timeValue),DATEADD(minute, +30, @timeValue)
    WHERE CONVERT(datetime,@timeValue) BETWEEN DATEADD(minute, -30, CONVERT(datetime,@timeValue)) AND DATEADD(minute, +30, CONVERT(datetime,@timeValue))
    

    【讨论】:

    • 有效答案 Pawel。感谢您的回复。
    【解决方案3】:

    您还可以使用CASE 语句的帮助。如果时间值移动到第二天,则将最大限制设置为'23:59'。

    declare @timeValue1 time
    SET @timeValue1 = '23:45:00'
    
    SELECT @timeValue1,DATEADD(minute, -30, @timeValue1),DATEADD(minute, +30, @timeValue1)
    WHERE @timeValue1 BETWEEN DATEADD(minute, -30, @timeValue1) 
         AND case WHEN(DATEADD(minute, +30, @timeValue1))<@timeValue1 THEN '23:59:59.9999999' ELSE (DATEADD(minute, +30, @timeValue1)) END
    

    输出:

    【讨论】:

    • 有效答案 Unnikrishnan。感谢您的回复。
    【解决方案4】:

    我没有做任何复杂的事情。我也没有测试过所有场景,但是下表和简单的查询可以满足我目前的需要。

    | zone | days    | start    | stop     |
    +------+---------+----------+----------+
    |    1 | 1234567 | 05:00:00 | 17:59:59 |
    |    2 | 1234567 | 05:00:00 | 17:59:59 |
    |    3 | 1234567 | 05:00:00 | 17:59:59 |
    |    1 | 1234567 | 18:00:00 | 04:59:59 |
    |    2 | 1234567 | 18:00:00 | 04:59:59 |
    |    3 | 1234567 | 18:00:00 | 04:59:59 |
    

    SELECT days,start,stop,
    IF(stop < start,
          ( IF(('04:55:00' BETWEEN start AND '24:00:00') OR 
             ('04:55:00' BETWEEN '00:00:00' AND stop), 'y', 'n') ),
             ( IF('04:55:00' BETWEEN start AND stop, 'y', 'n') )
          ) AS z FROM temp_settings_plans_details HAVING z='y'
    

    04:55:00 是输入。

    【讨论】:

    • 这似乎不是直接回答OP的问题,只是解决了类似的任务
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多