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

従業員のチェックインとチェックアウトを表すように設計する

    この投稿は古くなっていることは知っていますが、これはまだ解決策を探している人のためのものです:

    出席テーブルの構造

    id              | int
    employee_code   | varchar
    status          | enum('check_in','check_out')
    created         | datetime
    

    データ

    id  employee_code   status          created
    
    1   EMP0001         check_in        2016-08-20 09:30:30
    2   EMP0001         check_out       2016-08-20 18:15:00
    3   EMP0002         check_in        2016-08-21 14:52:48
    4   EMP0002         check_out       2016-08-21 21:09:18
    

    クエリ

    SELECT 
      A1.employee_code,
      A1.created AS check_in_at,
      A2.created AS check_out_at,
      TIMEDIFF(A2.created, A1.created) AS total_time 
    FROM
      tbl_attendances AS A1 
      INNER JOIN tbl_attendances AS A2 
        ON A1.employee_code = A2.employee_code 
        AND DATE(A1.created) = DATE(A2.created) 
    WHERE 1 = 1 
      AND A1.status = 'check_in' 
      AND A2.status = 'check_out' 
      AND DATE(A1.created) BETWEEN '2016-08-20' 
      AND '2016-08-21' 
      AND DATE(A2.created) BETWEEN '2016-08-20' 
      AND '2016-08-21' 
    ORDER BY A1.created DESC
    

    結果

    employee_code   check_in_at            check_out_at           total_time
    
    EMP0002         2016-08-21 14:52:48    2016-08-21 21:09:18    06:16:30
    EMP0001         2016-08-20 09:30:30    2016-08-20 18:15:00    08:44:30
    

    特定の従業員については、AND A1.employee_code = 'EMP0001'を追加します WHERE 条項



    1. ネストされたトランザクションはMySQLで許可されていますか?

    2. setFetchSize()をいつ何を指定する必要がありますか?

    3. 文字列内の一意の文字の数を数える

    4. PostgreSQLでの高可用性の管理–パートII:Replication Manager