SQL Server 2000 の使用
休日(表)
dates
2012-08-02
2012-08-19
2012-08-20
表1
id dates time
001 01/08/2012 00:00
001 02/08/2012 00:00
001 03/08/2012 00:00
001 04/08/2012 12:00
...
...
001 17/04/2012 11:00
001 18/08/2012 00:00
001 19/08/2012 00:00
001 20/08/2012 00:00
001 21/08/2012 12:00
...
各列の前日と次日を確認し、現在または不在または休日を更新したい。
条件
- 現在の行時間が 00:00 と等しくない場合、ステータスは
P
(Present)になります。 - 前の日時列が 00:00 で、次の日時列が 00:00 の場合、自動的に現在の行のステータスは
AB
(Absent) になります。 - 日付が休日テーブルの日付と等しい場合、自動的に現在の行のステータスが
H
注: このクエリは失敗することなく実行されています。唯一の懸念は時間がかかることです...
クエリ
Select
t2.id,
t2.dates,
case
when t2.time <> '00:00'
then 'P'
when t4.dates = t2.dates and t1.intime = '00:00' and t3.intime = '00:00'
then 'AB'
else 'H'
end as attn
from
(
Select id, dates, time from table1
where t1.dates = Cast('18/08/2012' as datetime)
) t1
left outer join
(
Select id, dates, time from table1
where t2.dates = Cast('19/08/2012' as datetime)
) t2
on t1.id = t2.id
left outer join
(
Select id, dates, time from table1
where t2.dates = Cast('20/08/2012' as datetime)
) t3
on t2.id = t3.id
left outer join
(
select dates from holiday
) t4
on t4.dates = t2.dates
上記のクエリは正常に動作していますが、各から01/09/2012
までのデータを表示したいため、表示に時間がかかりました。ID の数は n で、システムは各 ID の前の日付と次の日付をチェックし、結果を表示しています。 30/09/2012
id
データを表示するための他の代替クエリまたはソリューションがあります