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



>我有一个查询

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

等?

目前我一遍又一遍地重复它,而且很乏味......谢谢

我最好的跨dbms方法是在表"rental"中添加一列,其中包含一个整数,表示值time(created)为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 完全兼容。

希望对您有所帮助。

这里是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)

最新更新