2016-06-09 123 views
0

我們有一個內容表如下圖所示,MySQL查詢彙總基於shiftwise天數據一個月

Timestamp   | Total_Value 
2015-06-05 07:14:23 ------------568 
2015-06-06 15:14:23 ------------768 
2015-06-07 15:14:23 ------------868 
2015-06-08 19:47:30 ------------968 
2015-06-30 19:47:30 ------------1668 
2015-07-01 06:47:30 ------------268 

班次,當天上午7點到次日早上7點開始。共三班倒。所以每天的數據計算需要第二天的數據直到上午7點。

SELECT DAY(TIMESTAMP) AS DAY, MAX(Total_Value) AS `Total` 
FROM Table_NAME 
WHERE MONTH(TIMESTAMP) = MONTH(NOW()) 
GROUP BY DAY(TIMESTAMP) 
ORDER BY DAY 

上面的查詢提供了單獨的天中的數據正確地進行2015年6月1日00:00之間的時間戳2015年6月30日23:59:59

但我需要的數據在的

Day --------Total_Value 
1 ------------0 
2 ------------0 
3 -------------0 
4 -------------0 
5 ------------568 
6 ------------768 
7 ------------868 
8 ------------968 

. 
. 
. 
. 
30 ------------1768 

2)形式之間2015年6月1日7點00分零零秒到2015年7月1日6點59分59秒一個月還需要MySQL查詢一天打入3班,其中上班時間爲早上7點至下午3點30分,下午3點30分至晚上11點以及晚上11點至上午7點(次日),並分組一週。

請幫忙解決這個問題。提前致謝。

回答

0

從時間戳中減去7小時,將其調整爲適合輪班的適當日期。

SELECT DAY(DATE_SUB(timestamp, INTERVAL 7 HOUR)) AS Day, MAX(total_value) AS Total 
FROM Table_Name 
WHERE MONTH(DATE_SUB(timestamp, INTERVAL 7 HOUR)) = MONTH(NOW()) 
GROUP BY Day 
ORDER BY Day 

要分解成換檔,使用CASE表達式來確定移位

SELECT DAY(DATE_SUB(timestamp, INTERVAL 7 HOUR)) AS Day, 
     CASE WHEN DATE_FORMAT(timestamp, '%H:%i') < '07:00' THEN 3 
      WHEN DATE_FORMAT(timestamp, '%H:%i') < '15:30' THEN 1 
      WHEN DATE_FORMAT(timestamp, '%H:%i') < '23:00' THEN 2 
      ELSE 3 
     END AS Shift, 
     MAX(total_value) AS Total 
FROM Table_Name 
WHERE MONTH(DATE_SUB(timestamp, INTERVAL 7 HOUR)) = MONTH(NOW()) 
GROUP BY Day, Shift 
ORDER BY Day, Shift 
+0

非常感謝Barmar .. !!大..!!你能幫忙解決(2)問題嗎? 2)還需要MySQL查詢,將每天的班次分爲3班,其中班次爲上午7點至下午3點30分,下午3點30分至晚上11點以及晚上11點至上午7點(第二天),並將分組爲一週。 – user2114103

+0

我的答案有變化。 – Barmar

+0

爲什麼你不能按周自己分組?使用MySQL的'WEEK()'函數。 – Barmar