これはもともと、特定の部分で立ち往生していたため、これを実装する方法についての質問になる予定でしたが、そもそもなぜこれが起こったのかについて興味があります. 時間が変わらなければ問題にならなかった時間ではなく、日付のみを比較する必要がありました。以下のコードは、私が最初に試していたクエリを示しています
SELECT *
FROM Employee e
inner join OT_Hours o on o.Emp_ID=e.Emp_ID
inner join Position p on p.Position_ID=e.Position_ID
inner join Signup_Sheet s on s.Employee_ID=e.Emp_ID
WHERE e.Eligible_OT=1 and s.Day_Shift = 1
and p.Position_Name = 'Controller'
and Convert(Varchar(20),s.Date,101) = '07/26/2010'
and Convert(Varchar(20),o.Date,101) <='07/26/2010'
and Convert(Varchar(20),o.Date,101) > '07/26/2009'
and o.Quantity NOT IN(0.3) order by o.Date DESC
そのクエリを実行しても結果は得られませんでしたが、最後から 2 行目を削除すると 12 件の結果が返され (<=)、最後から 3 行目を削除しても最後から 2 行目を保持すると 6 件の結果が返されました (>)。データを確認したところ、これらの結果のうち 4 つが返されているはずであることがわかりました。さて、奇妙な部分です。以下は、私が現在使用しているコードです。
SELECT DISTINCT o.Date, e.Emp_ID as Emp_ID, e.First_Name+ ' ' +e.Last_Name as Name, o.Quantity as Sum
FROM Employee e
left join OT_Hours o on o.Emp_ID=e.Emp_ID
left join Position p on p.Position_ID=e.Position_ID
left join Signup_Sheet s on s.Employee_ID=e.Emp_ID
WHERE e.Eligible_OT=1 and s.Day_Shift = 1
and p.Position_Name = 'Controller'
and Convert(Varchar(20),s.Date,101) = '07/26/2010'
and o.Date between '07/26/2009' and '07/26/2010'
and o.Quantity NOT IN(0.3) order by o.Date DESC
このクエリは結果を返しますが、o.Date が指定された日付より上または下にある場合に、他のクエリと同様にテストしました。日付が <= 16 の場合は結果が返され、> 8 の場合は結果が返されました。最後のクエリは 6 つの結果を生成しました。これは、クエリを実行している実稼働データベースではなく、それを使用しているのは私だけなので、データは変更されませんでした。なぜこれが起こったのかについての説明はありますか?それを varchar に変換することと関係があり、適切に比較できなかったと仮定していますが、それではなぜ 12 <=, 6 > になり、最終的に結果が得られないのか説明できません。また、これを実装するためのより良い方法を誰かが知っている場合は、私に知らせてください。