2014-01-10 53 views
0

我有一個查詢破一個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 

等?

在此刻,我一遍又一遍地重複它,是相當乏味...... 感謝

+0

請添加相應的SQL標籤,例如'sql-server','mysql','oracle'等 – StuartLC

回答

0

我最好的跨DBMS的做法是將加上一欄表「租賃」含有表示整數價值時間(創建)爲30分鐘時隙(即0 = 1月1970年00:00:00至00:29:59,1 = 1月1970年00:30:00至00:59:59,2 = 1月1日1970 01:00:00到01:29:59 - 這非常簡單,基本上它是時間戳/ 30000向下取整),然後使用該字段對值進行分組。

您可以即時進行分割,但這會在某些DBMS上產生問題,這種解決方案更具可擴展性,並且幾乎可與任何dbms完全兼容。

希望它有幫助。

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) 
+0

嗨,我正在使用MYSQL 5 - 你的代碼給了我一個語法錯誤,但不能確定在哪裏.. – user2894986

+0

是的...這是SQL Server語法 我已添加mysql標記到您的問題 –

+0

謝謝 - 我收到此錯誤: SQL查詢: DECLARE @startTime SMALLDATETIME ='2013-12-30 00:00:00'; MySQL說:文檔 #1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以找到在第1行'DECLARE ...'附近使用的正確語法 – user2894986