sql选择连续一段时间的值

时间:2017-05-01 09:22:19

标签: sql select time

我有一张下面结构的表格:

id INT, order_id INT, datex DATE, timex TIME

例如,我想在特定时间段内从2017-10-242017-10-26选择订单ID的计数。与2:0:0 - 4:0:04:0:0 - 6:0:0等类似,并制作如下结果:

period        | ordersID's
2:0:0 - 4:0:0 | 5
4:0:0 - 6:0:0 | 8

我可以通过查询来执行此操作,还是应该使用其他方法?

1 个答案:

答案 0 :(得分:0)

首先,你的时间段是重叠的。目前尚不清楚订单是否发生在他们应属于的4个时期。对于我下面的例子,我假设在期末的时间发生的订单属于下一个时期。

使用查询解决此问题的一种方法是在SELECT和GROUP BY子句中使用case语句。

CREATE TABLE #test
(
    id int identity(1,1),
    order_id int,
    datex date,
    timex time
)

INSERT INTO #test VALUES
(5, '10/24/2017', '02:01'),
(5, '10/24/2017', '04:01'),
(6, '10/25/2017', '03:01'),
(7, '10/26/2017', '05:01'),
(8, '10/27/2017', '02:01')

SELECT
    CASE
        WHEN timex >= '02:00' AND timex < '04:00' THEN '2:0:0 - 4:0:0'
        WHEN timex >= '04:00' AND timex < '06:00' THEN '4:0:0 - 6:0:0'
        END AS 'periodLabel', 
    COUNT(order_id) AS 'OrderCount'
FROM
    #test
WHERE
    datex >= '10/24/2017'
    AND datex <= '10/26/2017'
GROUP BY
    CASE
        WHEN timex >= '02:00' AND timex < '04:00' THEN '2:0:0 - 4:0:0'
        WHEN timex >= '04:00' AND timex < '06:00' THEN '4:0:0 - 6:0:0'
        END

解决此问题的另一种方法是创建一个包含您的时间段的表并加入它。我更喜欢这种解决方案,因为它更容易维护。

CREATE TABLE #timePeriod
(
    periodLabel varchar(50),
    periodBegin time,
    periodEnd time
)

INSERT INTO #timePeriod VALUES
('02:00 - 04:00', '02:00', '04:00'),
('04:00 - 06:00', '04:00', '06:00')

SELECT
    B.periodLabel,
    COUNT(order_id) AS 'OrderCount'
FROM
    #test AS A
    JOIN #timePeriod AS B
        ON A.timex >= B.periodBegin
            AND A.timex < B.periodEnd
WHERE
    A.datex >= '10/24/2017'
    AND A.datex <= '10/26/2017'
GROUP BY
    B.periodLabel