如何在午夜变换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
答案 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
答案 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
是输入。