我myTable
列RecTime AS DATETIME
RecTime
-----------------------
2013-05-22 15:32:37.530
2013-05-22 22:11:16.103
2013-05-22 16:24:06.883
2013-05-22 16:38:30.717
2013-05-22 23:54:41.777
2013-05-23 22:01:00.000
2013-05-23 09:59:59.997
我需要一个SQL语句告诉我哪些日期包含12:00到22:00之间的时间
预期结果是: -
RecTime | foo
------------------------|-----
2013-05-22 15:32:37.530 | 1
2013-05-22 22:11:16.103 | 0
2013-05-22 16:24:06.883 | 1
2013-05-22 16:38:30.717 | 1
2013-05-22 23:54:41.777 | 0
2013-05-23 22:01:00.000 | 0
2013-05-23 09:59:59.997 | 0
现在我使用以下内容: -
SELECT
[RecTime]
, CASE WHEN [RecTime] >= CONVERT(DATETIME, CONVERT(VARCHAR(4), DATEPART(YEAR, [RecTime])) + '-' + CONVERT(VARCHAR(2), DATEPART(MONTH, [RecTime])) + '-' + CONVERT(VARCHAR(2), DATEPART(DAY, [RecTime])) + ' 12:00')
AND [RecTime] <= CONVERT(DATETIME, CONVERT(VARCHAR(4), DATEPART(YEAR, [RecTime])) + '-' + CONVERT(VARCHAR(2), DATEPART(MONTH, [RecTime])) + '-' + CONVERT(VARCHAR(2), DATEPART(DAY, [RecTime])) + ' 22:00')
THEN 1
ELSE 0
END
FROM dbo.myTable
我知道这不是最好的解决方案/性能。
帮助将不胜感激
答案 0 :(得分:3)
你已经找到了DATEPART
,然而明显没有想到:
CASE WHEN DATEPART(hour,[RecTime]) >= 12
AND DATEPART(hour,[RecTime]) < 22
THEN 1
ELSE 0
作为旁注,当使用像时间这样的连续统一体时,定义半开放区间(在开始时使用>=
并在结束时使用<
)几乎总是更明智,否则你最终会把22:00:00000等奇怪的东西包含在你的期间内,并且22:00:00.003被排除在外。这很少是正确的。我调整了我的查询以匹配这种模式。
我知道这不是最好的解决方案/性能。
此查询的性能总是很差,因为我们永远无法利用索引。如果这是一种常见的查询形式(仅查询Hour组件),您可以考虑添加一个可以编制索引的计算列。
要完全包括22:00:00.000,我会将其作为一个单独的专业案例来处理:
CASE WHEN DATEPART(hour,[RecTime]) >= 12
AND DATEPART(hour,[RecTime]) < 22
THEN 1
WHEN DATEPART(hour,RecTime) = 22 AND DATEPART(minute,RecTime) = 0 and DATEPART(second,RecTime) = 0 and DATEPART(millisecond,RecTime) = 0
THEN 1
ELSE 0
答案 1 :(得分:3)
另一种方法
SELECT RecTime,
CASE WHEN CAST(RecTime AS TIME)
BETWEEN '12:00:00' AND '22:00:00'
THEN 1 ELSE 0 END foo
FROM Table1
输出:
| RECTIME | FOO | |----------------------------|-----| | May, 22 2013 15:32:37+0000 | 1 | | May, 22 2013 22:11:16+0000 | 0 | | May, 22 2013 16:24:06+0000 | 1 | | May, 22 2013 16:38:30+0000 | 1 | | May, 22 2013 23:54:41+0000 | 0 | | May, 23 2013 22:01:00+0000 | 0 | | May, 23 2013 09:59:59+0000 | 0 |
这是 SQLFiddle 演示
答案 2 :(得分:1)
SELECT
[RecTime],
(Select CASE
WHEN DATEPART(hour,[RecTime]) between 12 AND 22 Then 1
else 0
END
From dbo.myTable ) as foo
From dbo.myTable