我有一个查询
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
等?
目前我一遍又一遍地重复它并且非常繁琐...... 感谢
答案 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)