2015-04-28 28 views
0

我想獲得一個查詢,將返回與某一時刻的範圍內讀取總(在working_hours表中定義)的結果集的具體日期小時範圍內的行取決於DAYOFTHEWEEK與一個日期結果,看起來像:MySQL的 - 使用DAYOFWEEK

working | nonworking | weekend | date    | group_id 
----------------------------------------------------------------- 
50.3 | 30.8  | 0  | 2015-04-01 00:00 | 7 
40.3 | 60.8  | 0  | 2015-04-01 00:00 | 8 
50.3 | 30.8  | 0  | 2015-04-02 00:00 | 7 
40.3 | 60.8  | 0  | 2015-04-02 00:00 | 8 

工作和週末範圍存儲在數據庫中working_hours,非工作時間範圍是隱含的(當天基本上NOT BETWEEN其它範圍)

的表格如下:

讀數表有每小時讀數,命名爲readings

group_id  | reading  | datestamp   
------------------------------------------------------ 
7   | 30.8  | 2015-04-01 00:00 
7   | 20.2  | 2015-04-01 01:00 
7   | 11.2  | 2015-04-02 00:00 
7   | 20.2  | 2015-04-02 01:00 
8   | 26.2  | 2015-04-01 00:00 
8   | 30.2  | 2015-04-01 01:00 
8   | 26.2  | 2015-04-02 00:00 
8   | 30.2  | 2015-04-02 01:00 

小時〜存儲在working_hours表,天塔是DAYOFTHEWEEK格式(1 =週日,2 =週一等):

group_id | day | range_start | range_end | range_type_id | day_type_id 
------------------------------------------------------------------------------ 
7  | 5 | 08:00:00 | 15:59:00 | 1    | 1 
7  | 6 | 00:00:00 | 05:59:00 | 1    | 2 
7  | 6 | 06:00:00 | 23:59:00 | 2    | 2 
7  | 1 | 00:00:00 | 22:59:00 | 2    | 4 
7  | 1 | 23:00:00 | 23:59:00 | 1    | 4 

表類型在working_hours_day_type表中,對於我來說事情變得複雜,平日和週末只有一個範圍,但開始/結束週末有兩個範圍('開始週末'的第一個範圍是工作時間,第二個範圍的週末時間和'結束週末'第一個RA nge是週末時間,第二個工作時間範圍)。

id | type 
------------------ 
1 | Weekday 
2 | Start Weekend 
3 | Weekend 
4 | End Weekend  

範圍類型在working_hours_range_type表:

id | type 
------------------ 
1 | Working 
2 | Weekend 

我的MySQL的知識僅限於簡單SELECTINSERT等和JOIN S中的基礎 - 我已經發現了約HOUR(datestamp) BETWEEN 8 AND 14但不知道如何讓子查詢使用WHERE datestamp BETWEEN '2015-04-01 00:00:00' AND '2015-04-02 23:59:00'母查詢中遍歷如果事實上那它怎麼做...

+0

對不起,你失去了我。這看起來像是一個過於複雜的設計 - 或者我錯過了什麼?如果列與問題無關,請不要包含它們。 – Strawberry

+0

am歡迎到簡化這個任何建議,我需要使用的指定範圍內的日常​​故障('讀數SUM')。如果4月1日是星期天,那麼請查看'working_hours'獲取星期日特有的任何範圍,並將它們應用到當天的讀數中以獲得總和。 – GPO

+0

您不需要額外的表格 - 您可以在第一次選擇時使用幾個CASE語句完成所有操作。 – bf2020

回答

0

我不是什麼構成完全清楚工作時間或非工作時間,但這是否工作?

SELECT 
sum(CASE WHEN rtype.range_type_id = 1 THEN reading ELSE 0 END) AS working 
sum(CASE WHEN rtype.range_type_id = 2 THEN reading ELSE 0 END) AS nonworking 
CASE WHEN r1.daynum in (7,1) THEN 1 ELSE 0 END as weekend 
date(datestamp) as date 
r1.group_id 
FROM 
    (SELECT 
     group_id, 
     reading, 
     time(datestamp) as rTime, 
     case when weekday(datestamp) = 0 THEN 2 #weekday() monday to working hours monday 
      when weekday(datestamp) = 1 THEN 3 
      when weekday(datestamp) = 2 THEN 4 
      when weekday(datestamp) = 3 THEN 5 
      when weekday(datestamp) = 4 THEN 6 
      when weekday(datestamp) = 5 THEN 7 
      when weekday(datestamp) = 6 THEN 1 
     else NULL 
     END CASE AS daynum 
    FROM readings) AS r1 
    LEFT JOIN working_hours w1 
     ON (r1.daynum = w1.day) 
     AND (r1.group_id = w1.group_id) 
     AND (r1.rTime BETWEEN w1.range_start AND w1.range_end) 
    LEFT JOIN working_hours_day_type dtype 
     ON w1.day_type_id = dtype.id 
    LEFT JOIN working_hours_range_type rtype 
     ON w1.range_type_id = rtype.id 
GROUP BY 
CASE WHEN daynum in (7,1) THEN 1 ELSE 0 END, 
date(datestamp) as date, 
r1.group_id 
+0

感謝您的回答,它給了我需要完成的任務!而不是被隱含的非工作時間我已經創造了他們RANGE_TYPE(不能參加對隱含的數據!),它簡化了查詢噸:[sqlfiddle](http://sqlfiddle.com/#!9/e831f/3 ) - 剝離了很多,以得到我需要的東西 - 不知道你是否想編輯你的小提琴什麼,所以我可以標記它是正確的? (也有一些錯別字等) – GPO

+0

我很高興它的工作,因爲你可以看到它是更復雜,比我想象的要在我原來的評論你的問題...... 我要返工根據您的答案評論,但當我嘗試加載它時,鏈接會導致404錯誤。有沒有答案的任何方面,我可以進一步解釋或評論什麼是SQL在做什麼? – bf2020