2017-07-02 109 views
-1

想要计算过去7天工作总时数的总和,我有一天的总工作时间。我有4项活动,如学习,学校,玩耍和睡觉。我想计算过去7天在学习和学校上所花费的总小时数。 我对Cakephp3.x 工作的任何查询,欢迎CakePHP的或MySQLMysql计算过去7天工作时间的总和

$driversHos = $this->DriverLogs->DriverLogGraphs->find('all', [ 
     'conditions' => [ 
      'OR' => [ 
       ['DriverLogGraphs.event_type' => 0], // On duty 
       ['DriverLogGraphs.event_type' => 1] // driving 
      ], 
      'DriverLogGraphs.driver_id' => $id, 
      'DriverLogGraphs.start_time >=' => $thisMonthFirstDay 
     ], 
     'contain' => [ 
      'DriverLogs.Companies', 
      'DriverLogs.Driver' 
     ], 
     'fields' => [ 
      'Driver.id', 
      'Driver.username', 
      'DriverLogs.driver_id', 
      'Companies.id', 
      'Companies.name', 
      'DriverLogGraphs.id', 
      'DriverLogGraphs.driver_log_id', 
      'DriverLogGraphs.event_type', 
      'event_name' => "CASE 
       WHEN DriverLogGraphs.event_type = '0' THEN 'ON DUTY' 
       WHEN DriverLogGraphs.event_type = '1' THEN 'DRIVING' 
       WHEN DriverLogGraphs.event_type = '2' THEN 'SLEEPER BIRTH' 
       WHEN DriverLogGraphs.event_type = '3' THEN 'OFF DUTY' 
      END", 
      'hos_date' => "STR_TO_DATE(DriverLogGraphs.start_time,'%Y-%m-%d')", 
      'hos_start' => "CONCAT(STR_TO_DATE(DriverLogGraphs.start_time,'%Y-%m-%d'),' ','00:00:00')", 
      'hos_end' => "CONCAT(STR_TO_DATE(DriverLogGraphs.start_time,'%Y-%m-%d'),' ','23:59:59')", 

      'today_start' => "CONCAT(CURDATE(), ' ', '00:00:00')", 
      'today_end' => "CONCAT(CURDATE(), ' ', '23:59:59')", 

      'work_time'   => 'TIMESTAMPDIFF(SECOND, DriverLogGraphs.start_time, DriverLogGraphs.end_time)', 
      'hours_work_today' => 'SUM(TIMESTAMPDIFF(SECOND, DriverLogGraphs.start_time, DriverLogGraphs.end_time))', 

      's_time_7_days' => 'CONCAT(STR_TO_DATE(DriverLogGraphs.start_time - INTERVAL 6 DAY, "%Y-%m-%d") , "", "")', 
      'e_time_7_days' => 'CONCAT(STR_TO_DATE(DriverLogGraphs.end_time, "%Y-%m-%d") , "", "")', 
      's_time_8_days' => 'CONCAT(STR_TO_DATE(DriverLogGraphs.start_time - INTERVAL 7 DAY, "%Y-%m-%d") , "", "")', 
      'e_time_8_days' => 'CONCAT(STR_TO_DATE(DriverLogGraphs.end_time, "%Y-%m-%d") , "", "")', 

      'hours_work_last_7_days' => ' 
       SUM(
        IF (
         DriverLogGraphs.start_time >= CONCAT(STR_TO_DATE(DriverLogGraphs.start_time - INTERVAL 6 DAY, "%Y-%m-%d") , " ", "00:00:00") 
         AND 
         DriverLogGraphs.end_time <= CONCAT(STR_TO_DATE(DriverLogGraphs.end_time, "%Y-%m-%d") , " ", "23:59:59"), 
         CASE 
          WHEN DriverLogGraphs.event_type = "0" THEN TIMESTAMPDIFF(SECOND, DriverLogGraphs.start_time, DriverLogGraphs.end_time) 
          WHEN DriverLogGraphs.event_type = "1" THEN TIMESTAMPDIFF(SECOND, DriverLogGraphs.start_time, DriverLogGraphs.end_time) 
          WHEN DriverLogGraphs.event_type = "2" THEN "0" 
          WHEN DriverLogGraphs.event_type = "3" THEN "0" 
         END, 
         "" 
        ) 
       )', 
     ],  
     'group' => [ 
      'hos_date', 
     ], 
     'order' => [ 
      'hos_start' => 'DESC', 
     ] 
    ])->hydrate(false)->toArray(); 

Check this image for quick understanding

+0

检查这些链接:https:// st ackoverflow.com/questions/15178319/mysql-query-issue-date-minus-7-days and https://stackoverflow.com/questions/42635297/sql-query-where-date-today-minus-7-days –

+0

如果你还在挣扎,请参阅https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a -very-simple-sql-query – Strawberry

回答

0

你必须在你的表有一个字段日期, student_id数据字段来标识的学生, 考虑model = 活动

$total_worked=$this->Events->find('all', [ 
'conditions'=>[ 
      'date >='=>DATE(DATE_SUB(NOW(), INTERVAL 7 DAY)), 
      'student_id' => $student_id 
      ] 
]); 
$StudentWorkingHour=''; 
foreach($total_worked as $worked){ 
    $eachStudentWorkingHour=$StudentWorkingHour+($worked['study']+$worked['school']) 
} 

echo StudentWorkingHour; // Will result the total worked in one week 
+0

在我的问题上面检查我的hours_work_last_7_days,我正在做这个 –

+0

我已经有start_time和end_time和event_type(0,1,2,3)我只需要计算0和1的总和event_type 。在我的问题 –

+0

附加过去7天内通过我的图像附加0和1 event_type。如果今天是30,那么从当月的24日到30日结束。如果今天是31,那么31到25的总和。我想我现在让你明白了 –