2016-06-09 124 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