sql:哪些日期包含12:00到22:00之间的时间
我有sql:哪些日期包含12:00到22:00之间的时间,sql,sql-server-2008-r2,sql-server-2012,Sql,Sql Server 2008 R2,Sql Server 2012,我有myTable列RecTime作为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语句,告诉我哪些日期包含1
myTable
列RecTime作为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
选择
[实时]
,当[RecTime]>=CONVERT(日期时间,CONVERT(VARCHAR(4),DATEPART(YEAR,[RecTime]))+'-'+CONVERT(VARCHAR(2),DATEPART(MONTH,[RecTime]))+'-'+CONVERT(VARCHAR(2),DATEPART(DAY,[RecTime])+'12:00'时的情况
而[RecTime]你已经发现了,但明显的事情并没有浮现在脑海中:
CASE WHEN DATEPART(hour,[RecTime]) >= 12
AND DATEPART(hour,[RecTime]) < 22
THEN 1
ELSE 0
还有一个办法
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 |
|RECTIME | FOO|
|----------------------------|-----|
|2013年5月22日15:32:37+0000 | 1|
|2013年5月22日22:11:16+0000 | 0|
|2013年5月22日16:24:06+0000 | 1|
|2013年5月22日16:38:30+0000 | 1|
|2013年5月22日23:54:41+0000 | 0|
|2013年5月23日22:01:00+0000 | 0|
|2013年5月23日09:59:59+0000 | 0|
这里是演示Doh,出于某种原因,我认为您需要一个子选择。当小时为22分,秒和毫秒大于0时,此方法有一个小问题。正如您在我的示例中看到的,结尾的第二行必须返回0,因为它大于22:00:00.000,我不希望这样。谢谢你让我知道。我完全理解你对“错误”逻辑的担忧,但我使用条件的情况是必需的@armen-我会将其作为单独的WHEN
子句处理。我在底部添加了一个示例。我喜欢这种方法。我唯一不确定的是@peterm建议的DATEPART()
vsCAST()
的性能。我将对这些方法进行大量测试,如果DATEPART()
获胜,那么这将成为我选择的答案!看起来DATEPART()
方法使用的CPU功率比CAST()AS TIME
更多(该表包含120.000.000行,执行时间差为20分钟)。现在,我们将坚持@peterm的方法!
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 |