如何在午夜之间变换2次之间查询时间数据类型

时间:2016-09-20 05:36:44

标签: sql sql-server

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

declare @timeValue time
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)

但是,如果我们采用上面的例子来确定时间在30分钟之前和之后是否有效,并且它在午夜之间变化。我没有得到预期的结果。

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

但是,如果我使用的时间不会像下面那样在午夜过夜,那么它就能正常工作。

declare @timeValue time
SET @timeValue = '23:00:00'

SELECT @timeValue,DATEADD(minute, -30, @timeValue),DATEADD(minute, +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

4 个答案:

答案 0 :(得分:1)

这是因为TIME数据类型没有日期组件。您将需要使用DATETIME或具有时间组件的其他日期日期类型之一。没有日期,你的时间不会超过这两次。

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)

答案 1 :(得分:0)

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

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))

答案 2 :(得分:0)

您还可以使用CASE声明的帮助。如果时间值移至第二天,请将最大限制设置为&#39; 23:59&#39;

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

输出 enter image description here

答案 3 :(得分:0)

我没有做任何复杂的事情。我也没有测试每种情况,但是到目前为止,下表和简单的查询即可满足我的需求。

| 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是输入。