0

これが私が探しているものを明確に説明できることを願っています。このサイトのいくつかの記事を読んで検索しましたが、探しているものが見つかりませんでした。私もこれを自分で理解しようと3時間近く費やしました。

レコードの数を数え、WorkTimeを合計しようとしています。これが私が扱ってきた私の質問です。

SELECT Log.User
 , sum(if(hour(endtime) = 0, 1, 0)) AS Midnight
 , sum(if(hour(endtime) = 1, 1, 0)) AS `1AM`
 , sum(if(hour(endtime) = 2, 1, 0)) AS `2AM`
 , sum(if(hour(endtime) = 3, 1, 0)) AS `3AM`
 , sum(if(hour(endtime) = 4, 1, 0)) AS `4AM`
 , sum(if(hour(endtime) = 5, 1, 0)) AS `5AM`
 , sum(if(hour(endtime) = 6, 1, 0)) AS `6AM`
 , sum(if(hour(endtime) = 7, 1, 0)) AS `7AM`
 , sum(if(hour(endtime) = 8, 1, 0)) AS `8AM`
 , sum(if(hour(endtime) = 9, 1, 0)) AS `9AM`
 , sum(if(hour(endtime) = 10, 1, 0)) AS `10AM`
 , sum(if(hour(endtime) = 11, 1, 0)) AS `11AM`
 , sum(if(hour(endtime) = 12, 1, 0)) AS `12PM`
 , sum(if(hour(endtime) = 13, 1, 0)) AS `1PM`
 , sum(if(hour(endtime) = 14, 1, 0)) AS `2PM`
 , sum(if(hour(endtime) = 15, 1, 0)) AS `3PM`
 , sum(if(hour(endtime) = 16, 1, 0)) AS `4PM`
 , sum(if(hour(endtime) = 17, 1, 0)) AS `5PM`
 , sum(if(hour(endtime) = 18, 1, 0)) AS `6PM`
 , sum(if(hour(endtime) = 19, 1, 0)) AS `7PM`
 , sum(if(hour(endtime) = 20, 1, 0)) AS `8PM`
 , if(hour(endtime) = 20, sec_to_time(sum(time_to_sec(endtime) - time_to_sec(starttime))), 0) AS `8PM Time`
 , sum(if(hour(endtime) = 21, 1, 0)) AS `9PM`
 , sum(if(hour(endtime) = 22, 1, 0)) AS `10PM`
 , sum(if(hour(endtime) = 23, 1, 0)) AS `11PM`
FROM
  (
  SELECT user
   , controlnumber
   , starttime
   , endtime
   , timediff(endtime, starttime) AS Worktime
FROM
   atrtaxcert.ordertimeworked
  ) AS Log
GROUP BY
   Log.User;

これらの開始時間と終了時間はわずか数分です。どんなガイダンスでも大歓迎です。これはここでの私の最初の投稿であり、説明に役立つ画像を提供することができませんでした。

4

1 に答える 1

0

starttimeとendtimeがTIMEデータ型の場合は、TIME_TO_SEC関数を使用して、減算を実行します。秒を合計してから、合計を文字列表現に変換します。

SELECT `Log`.`User`
     , ...
     , SUM(HOUR(`Log`.endtime)=20) AS `8PM_count` 
     , SUM(IF(HOUR(`Log`.endtime)=20,work_seconds,0) AS `8PM_seconds`
     , SEC_TO_TIME(SUM(IF(HOUR(`Log`.endtime)=20,`Log`.work_seconds,0) AS `8PM_hhhmmss`
     , ...
  FROM ( SELECT
              , TIME_TO_SEC(endtime)-TIME_TO_SEC(starttime) AS work_seconds
       ) `Log`
 GROUP
    BY `Log`.`User`

注:これ:

SELECT HOUR(endtime)=0 AS foo

と同等の省略形です

SELECT IF(HOUR(endtime) = 0, 1, 0) AS foo

starttimeおよびがDATETIME値の場合endtime、TIMESTAMPDIFF関数を使用して、秒単位の差を計算できます。

SELECT `Log`.`User`
     , ...
     , SUM(HOUR(`Log`.endtime)=20) AS `8PM_count` 
     , SUM(IF(HOUR(endtime)=20,TIMESTAMPDIFF(SECOND,`Log`.starttime,`Log`.endtime),0) AS `8PM_seconds`
     , ...
  FROM (
       ) `Log`
 GROUP
    BY `Log`.`User`

(たとえば、starttime='23:59:00'およびendtime='00:01:00'の場合に返される値を無視する必要があります。これには、別の条件付きテストが必要になります。)

于 2013-02-01T02:58:59.487 に答える