2017-06-06 5 views
-1

SQLで次のクエリを使用すると、レコードが返されませんでした。SQLで日付範囲の間に使用するとレコードを取得できません

select distinct e.No from attendance a 
inner join Employee e on a.EmployeeId =e.No 
where e.No not in (select EmployeeId from attendance where AttendanceDate between '2017-05-26 00:00:00' and '2017-06-06 00:00:00') 

しかし、私が日付範囲の代わりに単一の日付を指定すると、正常に動作します。例えば

select distinct e.No from attendance a 
inner join Employee e on a.EmployeeId =e.No 
where e.No not in (select EmployeeId from attendance where AttendanceDate = '2017-06-06 00:00:00') 

誰かが私ではなく、特定の日付の日付範囲を使用するために持っているように、この問題を解決するために私を助けてください。

+0

返されるはずのデータがあることを確認してください。 –

+0

はい、それは個々の日付のレコードを返すためです – ASK

+0

「2017-05-26」と「2017-06-26」の間で試しましたか? –

答えて

0

whereステートメントでselectを実行すると結果が得られますか?

は、その上に時間なしでそれを試してみてください。

between '2017-05-26' and '2017-06-06' 

あなたはどのような日付形式を使用していますか?

+0

はい、レコードを返します。その2017-05-26 00:00:00の形式 – ASK

1

私はあなたのクエリのロジックについて混乱していると思う:

select distinct e.No 
from attendance a 
inner join Employee e 
    on a.EmployeeId = e.No 
where e.No not in 
(
    select EmployeeId from attendance 
    where AttendanceDate between '2017-05-26 00:00:00' and '2017-06-06 00:00:00' 
) 

サブクエリがEmployee表にすべての従業員番号を返すようにした場合、あなたからに戻って何レコードを取得しないだろうクエリ。これはWHERE NOT IN (...)の動作です。私の推測では、単一の日付クエリが「作業中」と表示される理由は、従業員レコードがその日付に一致しないため、結果セットが空ではないということです。

逆の動作が予想される場合は、おそらくWHERE e.No NOT INWHERE e.No INに変更する必要があります。

+0

私はこれらの日の間に存在していた従業員をすべて見つけなければなりませんでしたが、出席はマークされていませんでした(出席テーブルにはレコードがありません) 1つの日付で問題ありません。私は両方のテーブルでそれをチェックしました。しかし、私が日付範囲を指定すると、レコードは返されません – ASK

+0

'それは単にレコードを返しません。 '...私が言ったように、おそらくあなたは'どこで 'を行うつもりです。あなたはそれを試しましたか? –

+0

実際には、サブクエリは出席テーブルにレコードを持つすべての従業員IDを返します。そのため、not inを使用してこれらのIDを選択解除し、上記の出席テーブルにレコードを持たない残りのIDをフェッチします – ASK

関連する問題