0

我有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

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

帮助将不胜感激

4

3 回答 3

3

您已经发现DATEPART,但显而易见的是:

CASE WHEN DATEPART(hour,[RecTime]) >= 12
     AND DATEPART(hour,[RecTime]) < 22
    THEN 1
    ELSE 0

附带说明一下,当使用像时间这样的连续统时,定义半开放间隔(在>=开始和<结束时使用)几乎总是更明智,否则最终会出现奇怪的情况,例如 22:00:00.000恰好包含在您的期间,而 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
于 2013-09-03T14:48:24.597 回答
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

输出:

| 录音时间 | 福 |
|----------------------------|------|
| 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 |

这是SQLFiddle演示

于 2013-09-03T14:52:18.080 回答
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 
于 2013-09-03T14:50:48.583 回答