Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql:哪些日期包含12:00到22:00之间的时间_Sql_Sql Server 2008 R2_Sql Server 2012 - Fatal编程技术网

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()
vs
CAST()
的性能。我将对这些方法进行大量测试,如果
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 |