将sql查询结果分解为半小时的部分

时间:2014-01-10 09:12:53

标签: mysql sql repeat

我有一个查询

SELECT count(dayofweek(created)) FROM `rental` 
WHERE dayofweek(created) < 6
AND time(created) between "10:00:00" and "10:30:00"

我正在重复查询一天半小时的增量来查看最繁忙的时间是什么,即那个时期的租金数量。

有没有办法将整个事情做为1个查询,即输出如下内容:

period 1 | 1200
period 2 | 2130
period 3 | 2453

等?

目前我一遍又一遍地重复它并且非常繁琐...... 感谢

2 个答案:

答案 0 :(得分:0)

我最好的跨dbms方法是向表“rental”添加一个列,其中包含一个表示值时间(已创建)的整数作为30分钟的插槽(即0 = 1 jan 1970 00:00:00到00) :29:59,1 = 1 jan 1970 00:30:00至00:59:59,2 = 1 jan 1970 01:00:00至01:29:59 - 这很简单,基本上是时间戳/ 30000向下舍入)然后使用该字段对值进行分组。

您可以动态进行划分,但这会在某些DBMS上产生组的问题,此解决方案更具可扩展性,几乎与任何dbms完全兼容。

希望它有所帮助。

答案 1 :(得分:0)

这里是SQL Server语法中的定义

DECLARE @startTime SMALLDATETIME = '2013-12-30 00:00:00';
DECLARE @stopTime SMALLDATETIME = '2014-01-10 00:00:00';

WITH intervals(IntervalNo, intervalStart, dayNo)
AS
(
    SELECT 0, @startTime, datepart(dw, @startTime)
    UNION ALL
    SELECT intervals.IntervalNo + 1, DATEADD(MINUTE, 30, intervals.intervalStart), datepart(dw, DATEADD(MINUTE, 30, intervals.intervalStart))
    FROM intervals 
    WHERE DATEADD(MINUTE, 30, intervals.intervalStart) < @stopTime
) 
SELECT 'period'+CAST(DATEDIFF(MINUTE, @startTime, r.created) / 30 as VARCHAR(10)), COUNT(r.created)
FROM intervals i 
INNER JOIN rental r
    ON i.dayNo = datepart(dw, r.created) AND i.IntervalNo = DATEDIFF(MINUTE, @startTime, r.created) / 30 AND i.dayNo < 6
GROUP BY DATEDIFF(MINUTE, @startTime, r.created) / 30
OPTION (MAXRECURSION 0)