sql >> データベース >  >> RDS >> Mysql

1日あたりの残業を計算する

    あなたはこのようなことをすることができます

    SELECT empno, date_created, time_in, time_out, 
           CASE WHEN total_hours - 8 > 0 THEN total_hours - 8 ELSE 0 END overtime
      FROM
    (
      SELECT empno, date_created, time_in, time_out,
             TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
                                  COALESCE(time_in,  '09:00:00'))) / 3600 total_hours
        FROM
      (
        SELECT empno, date_created, 
               MIN(CASE WHEN status = 0 THEN time_created END) time_in,
               MIN(CASE WHEN status = 1 THEN time_created END) time_out
          FROM biometrics
         GROUP BY empno, date_created
      ) a
    ) b
    

    これがSQLFiddle です。 デモ

    time_inの実際のデフォルト値を指定する必要があります およびtime_out NULLの場合 。極端な場合、NULL ■ある日従業員が来て、別の日に帰宅するという事実が原因です。これらのデフォルト値は00:00:00である可能性があります。 および23:59:59 暦日ごとの残業を計算しているので、それぞれ。

    更新: overtimeが必要な場合 時間形式で表示される

    SELECT empno, date_created, time_in, time_out, 
           SEC_TO_TIME(
             CASE WHEN total_sec - 28800 > 0 
                  THEN total_sec - 28800 
                  ELSE 0 END) overtime
      FROM
    (
      SELECT empno, date_created, time_in, time_out,
             TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
                                  COALESCE(time_in,  '09:00:00'))) total_sec
        FROM
      (
        SELECT empno, date_created, 
               MIN(CASE WHEN status = 0 THEN time_created END) time_in,
               MIN(CASE WHEN status = 1 THEN time_created END) time_out
          FROM biometrics
         GROUP BY empno, date_created
      ) a
    ) b
    

    これがSQLFiddle です。 デモ



    1. MySQLで、1つの行をコピーして同じテーブルに挿入できますか?

    2. 教義における多対多の関係

    3. 時間間のデータベース内の同時イベントの検索

    4. Android用JDBCとWebサービス