sql:哪些日期包含12:00到22:00之间的时间

时间:2013-09-03 14:42:48

标签: sql sql-server-2008-r2 sql-server-2012

myTableRecTime 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

我知道这不是最好的解决方案/性能。

帮助将不胜感激

3 个答案:

答案 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