指定された日付の間のすべての日付を取得します

ドゥーニー・ダークー

この表とサンプルデータがあります。1か月全体または特定の日付の出席と、彼が働いていた時間や欠席した日などの情報を取得したいと思います。

CREATE TABLE Attendance
(
    [EmpCode] int,
    [TimeIn] datetime,
    [TimeOut] datetime
)

INSERT INTO Attendance VALUES (12, '2018-08-01 09:00:00', '2018-08-01 17:36:00');
INSERT INTO Attendance VALUES (12, '2018-08-02 09:00:00', '2018-08-02 18:10:00');
INSERT INTO Attendance VALUES (12, '2018-08-03 09:25:00', '2018-08-03 16:56:00');
INSERT INTO Attendance VALUES (12, '2018-08-04 09:13:00', '2018-08-05 18:09:00');
INSERT INTO Attendance VALUES (12, '2018-08-06 09:00:00', '2018-08-07 18:15:00');
INSERT INTO Attendance VALUES (12, '2018-08-07 09:27:00', '2018-08-08 17:36:00');
INSERT INTO Attendance VALUES (12, '2018-08-08 09:35:00', '2018-08-09 17:21:00');
INSERT INTO Attendance VALUES (12, '2018-08-10 09:00:00', '2018-08-10 17:45:00');
INSERT INTO Attendance VALUES (12, '2018-08-11 09:50:00', '2018-08-11 17:31:00');
INSERT INTO Attendance VALUES (12, '2018-08-13 09:23:00', '2018-08-13 17:19:00');
INSERT INTO Attendance VALUES (12, '2018-08-15 09:21:00', '2018-08-15 17:36:00');
INSERT INTO Attendance VALUES (12, '2018-08-16 09:00:00', '2018-08-16 17:09:00');
INSERT INTO Attendance VALUES (12, '2018-08-17 09:34:00', '2018-08-17 17:29:00');
INSERT INTO Attendance VALUES (12, '2018-08-18 09:00:00', '2018-08-18 17:10:00');
INSERT INTO Attendance VALUES (12, '2018-08-20 09:34:00', '2018-08-20 17:12:00');
INSERT INTO Attendance VALUES (12, '2018-08-21 09:20:00', '2018-08-21 17:15:00');
INSERT INTO Attendance VALUES (12, '2018-08-22 09:12:00', '2018-08-22 17:19:00');
INSERT INTO Attendance VALUES (12, '2018-08-23 09:05:00', '2018-08-23 17:21:00');
INSERT INTO Attendance VALUES (12, '2018-08-24 09:07:00', '2018-08-24 17:09:00');
INSERT INTO Attendance VALUES (12, '2018-08-25 09:12:00', '2018-08-25 17:05:00');
INSERT INTO Attendance VALUES (12, '2018-08-27 09:21:00', '2018-08-27 17:46:00');
INSERT INTO Attendance VALUES (12, '2018-08-28 09:17:00', '2018-08-28 17:12:00');
INSERT INTO Attendance VALUES (12, '2018-08-29 09:00:00', '2018-08-29 17:36:00');
INSERT INTO Attendance VALUES (12, '2018-08-30 09:12:00', '2018-08-30 17:24:00');

従業員が何時間働いたかを示すクエリがありますが、データがテーブルに存在した日のみが表示されています。指定された日付の間のすべての日付を表示したいのですが、データがない場合は列にNULLを入力する必要があります。

クエリは次のとおりです。

SELECT
    [EmpCode],
    FirstIN    = CAST(MIN([TimeIn]) AS TIME), 
    LastOUT    = CAST(MAX([TimeOut]) AS TIME), 
    CONVERT(VARCHAR(6), Datediff(second, CAST(MIN([TimeIn]) AS TIME), CAST(MAX([TimeOut]) AS TIME))/3600) 
       + ':'
       + RIGHT('0' + CONVERT(VARCHAR(2), (Datediff(second, CAST(MIN([TimeIn]) AS TIME), CAST(MAX([TimeOut]) AS TIME)) % 3600) / 60), 2) 
       + ':' 
       + RIGHT('0' + CONVERT(VARCHAR(2), Datediff(second, CAST(MIN([TimeIn]) AS TIME), CAST(MAX([TimeOut]) AS TIME)) % 60) , 2 ) AS HoursSpent,
    CAST(COALESCE(TimeIn, TimeOut) AS DATE) [Date]    
FROM Attendance
WHERE CAST(COALESCE(TimeIn, TimeOut) AS DATE) BETWEEN '2018-08-01' AND '2018-08-25'    
GROUP BY EmpCode, TimeIn, TimeOut
ヨゲシュシャルマ

そのためには、再帰的な方法を使用して可能な日付を生成する必要があります。

with t as (
     select '2018-08-01' as startdt
     union all
     select dateadd(day, 1, startdt)
     from t
     where startdt < '2018-08-25'
)

select . . . 
from t left join
     Attendance at
     on cast(coalesce(at.TimeIn, at.TimeOut) as date) = t.startdt; 

ステートメントtAttendanceテーブルの代わりに日付を使用してSELECTください。

注:日付期間の数が多い場合は、クエリヒントを使用することを忘れないでくださいOPTION (MAXRECURSION 0)デフォルトでは、100再帰レベルがあります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

SQLite:日付間のすべての日付を取得します

分類Dev

指定された日付で前と次の月曜日の日付を取得します

分類Dev

指定された日付の後に次の日曜日を取得します(bash)

分類Dev

SQLは指定された日付より後の日付を取得します

分類Dev

指定された2つの日付の間の日付を検索しています

分類Dev

指定された日付範囲のすべての日付を変数に格納します

分類Dev

指定された日付範囲のすべての日付を変数に格納します

分類Dev

MYSQLは、指定された値よりも小さい日付のすべての結果を取得します

分類Dev

PythonまたはMysqlの2つの日付の間に渡されたすべての月の月の開始日と終了日を取得します

分類Dev

phpファイルで指定された2つの日付の間のすべての日付を表示します

分類Dev

WebSQLで指定された日付に基づいてすべての行を取得します

分類Dev

セットベースのアプローチを使用して、指定された日付範囲間の特定の日付を取得します

分類Dev

指定された2つの日付の間の日付のみのエントリを選択します

分類Dev

Javaで指定された2つの日付の間のすべての日を生成する

分類Dev

日付範囲を展開して、除外された日付のテーブルから一連の日付範囲の間のすべての日付を取得します

分類Dev

指定された2つの日付の間の日付を生成し、PL / SQLでループします

分類Dev

指定された期間が経過した後、次の有効な日付を取得し、それに応じて月の日を調整します

分類Dev

OracleSQLの指定された日付からのみ日付を抽出します

分類Dev

Pythonデータフレーム:指定された日付範囲/期間の間の行を取得しますか?

分類Dev

今日からSwiftで指定された日付までの日付の配列を取得しますか?

分類Dev

2つの日付の間のcron式を使用して将来のすべての日付を取得します

分類Dev

日付が存在しない場合は、指定された日付の最後の行を取得します

分類Dev

TSQL-2つの指定された日付の間で日付を再帰的に選択します

分類Dev

TSQL-2つの指定された日付の間で日付を再帰的に選択します

分類Dev

指定された入力日付以下の日付値を含む名前のファイルを取得します

分類Dev

pandas datetimeindex:このインデックスで<=指定された日付の日付を取得します

分類Dev

先頭のゼロをそのままにして、指定された2つの日付の間の日付を生成することはできません

分類Dev

javaは、指定された日付の年の週を取得します

分類Dev

現在の日付を指定された日付Javaと比較します

Related 関連記事

  1. 1

    SQLite:日付間のすべての日付を取得します

  2. 2

    指定された日付で前と次の月曜日の日付を取得します

  3. 3

    指定された日付の後に次の日曜日を取得します(bash)

  4. 4

    SQLは指定された日付より後の日付を取得します

  5. 5

    指定された2つの日付の間の日付を検索しています

  6. 6

    指定された日付範囲のすべての日付を変数に格納します

  7. 7

    指定された日付範囲のすべての日付を変数に格納します

  8. 8

    MYSQLは、指定された値よりも小さい日付のすべての結果を取得します

  9. 9

    PythonまたはMysqlの2つの日付の間に渡されたすべての月の月の開始日と終了日を取得します

  10. 10

    phpファイルで指定された2つの日付の間のすべての日付を表示します

  11. 11

    WebSQLで指定された日付に基づいてすべての行を取得します

  12. 12

    セットベースのアプローチを使用して、指定された日付範囲間の特定の日付を取得します

  13. 13

    指定された2つの日付の間の日付のみのエントリを選択します

  14. 14

    Javaで指定された2つの日付の間のすべての日を生成する

  15. 15

    日付範囲を展開して、除外された日付のテーブルから一連の日付範囲の間のすべての日付を取得します

  16. 16

    指定された2つの日付の間の日付を生成し、PL / SQLでループします

  17. 17

    指定された期間が経過した後、次の有効な日付を取得し、それに応じて月の日を調整します

  18. 18

    OracleSQLの指定された日付からのみ日付を抽出します

  19. 19

    Pythonデータフレーム:指定された日付範囲/期間の間の行を取得しますか?

  20. 20

    今日からSwiftで指定された日付までの日付の配列を取得しますか?

  21. 21

    2つの日付の間のcron式を使用して将来のすべての日付を取得します

  22. 22

    日付が存在しない場合は、指定された日付の最後の行を取得します

  23. 23

    TSQL-2つの指定された日付の間で日付を再帰的に選択します

  24. 24

    TSQL-2つの指定された日付の間で日付を再帰的に選択します

  25. 25

    指定された入力日付以下の日付値を含む名前のファイルを取得します

  26. 26

    pandas datetimeindex:このインデックスで<=指定された日付の日付を取得します

  27. 27

    先頭のゼロをそのままにして、指定された2つの日付の間の日付を生成することはできません

  28. 28

    javaは、指定された日付の年の週を取得します

  29. 29

    現在の日付を指定された日付Javaと比較します

ホットタグ

アーカイブ