0

ユーザーが休日に H のコードを入力しなかった場合にタイム シート テーブルにエラー フィールドを入力する更新クエリを作成しようとしています。

クエリは、タイム シートから 1 週間分のデータを調べる必要があり、休日のエントリが見つからない場合、またはエントリが見つかったが H のコードがない場合は、1 つの休日の日に複数のエントリを入力しても問題ありません。 Hコードあり。H コードが見つからない場合は、その週の時間詳細のすべてのエントリについて、時間詳細のエラー列に Y を追加する必要があります

週とアカウントがパラメータになります

Table  Time Sheet Fields account hours code date error
Table Hollidays Fields date

これは私が起こる必要があることのサンプルです

サンプルデータ

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    H    12345 null

これらのレコード エラー フィールドの 3 つすべてが [いいえ] に変わります

サンプルデータ

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    R    12345 null

これらのレコード エラー フィールドの 3 つすべてが [はい] に変わります

サンプルデータ

date,code,account,error
8/1/2012    R    12345 null
8/5/2012    R    12345 null
8/9/2012    H    12345 null
8/9/2012    R    12345 null

これらのレコード エラー フィールドの 3 つすべてが [いいえ] に変わります

4

1 に答える 1

1

これはあなたが望むものかもしれないと思います:

UPDATE ts
set error = 'Y'
FROM timesheet ts
left join holiday h
  on ts.tsdate between DateAdd(Day, -7, h.hdate) 
    and dateadd(d, datediff(d, 0, h.hdate), 0)
WHERE ts.tsdate > DateAdd(Day, -7, getdate())
  AND ts.tsdate <= dateadd(d, datediff(d, 0, getdate()), 0)
  and h.hdate is not null

デモで SQL Fiddle を参照してください

編集、コメントに基づいて、これが必要だと思います:

UPDATE ts
set error = CASE when h.hdate Is not null then 'H' ELSE 'R' END
FROM timesheet ts
left join holiday h
  on ts.tsdate between DATEADD(dd, -(DATEPART(dw, h.hdate)-1), h.hdate)
    and DATEADD(dd, 7-(DATEPART(dw, h.hdate)), h.hdate)
WHERE ts.tsdate > DATEADD(dd, -(DATEPART(dw, getdate())-1), getdate())
  AND ts.tsdate <= DATEADD(dd, 7-(DATEPART(dw, getdate())), getdate())

デモで SQL Fiddle を参照してください

この 2 番目のバージョンは、週の開始/終了 (サンプルは日曜から土曜) を取得し、それらの日付に休日があること、およびタイムシートの日付も同じ週にあることを確認します。休日の日が null でない場合、レコードは で更新されます。'H'それ以外の場合、その週のレコードは'R'.

于 2012-08-10T00:01:08.767 に答える