2

スタッフの動きを追跡するために使用するサードパーティのクロッキングアプリケーションがあります。MariaDB で実行されますが、かなり面倒です (imo)。フロントエンドは Windows ベースで、すべての処理はそこで行われます。問題は、リアルタイム レポート用にデータを抽出したいということです。

すべてのクロッキング アクティビティは、1 つのテーブルに保存されます。以下のサンプルを参照してください。

INDX    _DATE_      _TIME_      SURNAME WIEGANDID       ZKINOUT
51      2018/09/03  5:52:04     Thakadu 000000000000AE  0
198     2018/09/03  14:04:29    Thakadu 000000000000AE  1
309     2018/09/03  21:54:06    Mabeo   000000000000BA  0
370     2018/09/04  5:47:20     Thakadu 000000000000AE  0
401     2018/09/04  6:00:09     Mabeo   000000000000BA  1
557     2018/09/04  14:04:57    Thakadu 000000000000AE  1
691     2018/09/04  21:53:33    Mabeo   000000000000BA  0
748     2018/09/05  5:47:20     Thakadu 000000000000AE  0
780     2018/09/05  6:00:34     Mabeo   000000000000BA  1
946     2018/09/05  14:05:32    Thakadu 000000000000AE  1
1089    2018/09/05  21:49:48    Mabeo   000000000000BA  0
1144    2018/09/06  5:50:41     Thakadu 000000000000AE  0
1174    2018/09/06  6:00:16     Mabeo   000000000000BA  1
1328    2018/09/06  14:09:28    Thakadu 000000000000AE  1
1482    2018/09/06  21:50:32    Mabeo   000000000000BA  0
1568    2018/09/07  5:58:48     Thakadu 000000000000AE  0
1555    2018/09/07  6:01:01     Mabeo   000000000000BA  1
1812    2018/09/07  14:05:47    Thakadu 000000000000AE  1
1845    2018/09/07  21:51:31    Mabeo   000000000000BA  0

課題は、マベオが 22:00:00 から翌朝 06:00:00 まで働く場所で発生します。また、何らかの理由でスタッフが退勤しない場合、システムは時間を記録せずに自動的にログアウトします。

私が見たい結果は次のようになります。

DATE_IN     TIME_IN    DATE_OUT    TIME_OUT    SURNAME    WIEGANDID
2018/09/03  05:52:04   2018/09/03  14:04:29    Thakadu    000000000000AE    
2018/09/03  21:54:06   2018/09/04  06:00:09    Mabeo      000000000000BA
2018/09/04  05:47:20   2018/09/04  14:04:57    Thakadu    000000000000AE
2018/09/04  21:53:33   2018/09/05  06:00:16    Mabeo      000000000000BA

このようにして、一定期間にわたって各emplyが記録された実際の時間を計算できます。

GROUP BY と CASE を使用してある程度の成功を収めることができましたが、夜勤の従業員に問題が発生しました。

どんな助けでも大歓迎です。

- - - - - - - - - - - - - - - - -アップデート - - - - - - - - ---------------

わかりました。貢献してくれたすべての人に感謝します。まだ100%ではないことを除いて、私はほとんど答えを得ています。@ rf1234 の提案に従って、次のコードを使用しました。回答ありがとうございます。

SELECT COALESCE (a.DATE_IN, b.DATE_IN)                  AS DATE_IN,
       SUBSTR(COALESCE (a.TIME_IN, b.TIME_IN), 1, 8)    AS TIME_IN,
       CASE WHEN ( b.DATE_TIME_OUT > a.DATE_TIME_IN ) THEN COALESCE (a.DATE_OUT, 
            b.DATE_OUT) ELSE '' END                     AS DATE_OUT,
       CASE WHEN ( b.DATE_TIME_OUT > a.DATE_TIME_IN ) THEN 
            SUBSTR(COALESCE (a.TIME_OUT, b.TIME_OUT), 1, 8) ELSE '' END
                                                        AS TIME_OUT,
       COALESCE (a.SURNAME, b.SURNAME)                  AS SURNAME,
       COALESCE (a.WIEGANDID, b.WIEGANDID)              AS WIEGANDID,
       CASE WHEN ( b.DATE_TIME_OUT > a.DATE_TIME_IN ) THEN
            TIMESTAMPDIFF(SECOND, a.DATE_TIME_IN, b.DATE_TIME_OUT) / 3600 ELSE '' END
                                                        AS HOURS_WORKED
FROM (
    SELECT  _DATE_  AS  DATE_IN,
            _TIME_  AS  TIME_IN,
            NULL    AS  DATE_OUT,
            NULL    AS  TIME_OUT,
            SURNAME,
            WIEGANDID,
            CONCAT( _DATE_, ' ', _TIME_ ) AS DATE_TIME_IN
          FROM _2018_09
         WHERE ZKINOUT = 0 AND SURNAME = 'MABEO'
         GROUP BY WIEGANDID, _DATE_ )   AS   a,
    (

    SELECT  NULL    AS  DATE_IN,
        NULL    AS  TIME_IN,
        _DATE_  AS  DATE_OUT,
        _TIME_  AS  TIME_OUT,
        SURNAME,
        WIEGANDID,
        CONCAT( _DATE_, ' ', _TIME_ ) AS DATE_TIME_OUT
      FROM _2018_09
     WHERE ZKINOUT = 1 AND SURNAME = 'MABEO'
     GROUP BY WIEGANDID, _DATE_)   AS   b
WHERE a.WIEGANDID = b.WIEGANDID
ORDER BY 1, 2, 3, 4

今のところ、1 人の従業員のみを選択するようにコードを変更しました。私が得た結果は、テーブル a の各レコードをテーブル b の各レコードに結合しているように見えることを除いて、ほとんど私が望むものですか? 以下は、結果のサンプルの画像です。

結果セットのサンプル

4

2 に答える 2

0

先週、従業員のパンチインとパンチアウトの時間を監視して出席を監視するアプリの作成を完了したため、データをさらに分析するために、休暇、半日などを取得しました。

提供されたデータを見て、分析アプリが非常にシンプルになった理由をお勧めします。punchIN と PunchOUT にタイムスタンプ データ型を使用します。この手順により、既存の列がマージされるだけでなく、作業の障害がなくなります。

IN 時間と OUT 時間を使用して、「勤務時間」を計算できます (単純な算術演算です!)。フラグを追加して、夜間に勤務したかどうかを確認できます (BETWEEN 関数を使用)、など。すぐに使用できる単純な関数は、先導してください!

何か助けが必要な場合はお知らせください...!!

于 2018-09-26T17:32:24.067 に答える