2016-09-20 83 views
0

如何查询时间数据类型,时间数据类型在午夜两点之间变化。 这是我试过的。如何查询时间数据类型,并在午夜两点之间变化

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:22 00.0000000:30:00.0000000 23:30:00.0000000

回答

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

有效答案Pawel。感谢您的回应。 – Prateek

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

有效的答案马特..感谢响应。 – Prateek

0

你也可以使用一个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 

输出: enter image description here

+0

有效答案Unnikrishnan。感谢您的回应。 – Prateek

相关问题