2017-12-29 84 views
1

私は2つのテーブルがあります。SQL - 2つのテーブル(特定の日付範囲/時間)を使用して、日付範囲内のレコードを取得します

表1:

Name, StartDate, EndDate 

例:

Timmy, 9/12/17 08:00:00, 9/13/17 00:00:00 
Timmy, 9/13/17 05:00:00, 9/13/17 07:00:00 

を表2:

Name, StartHour, Data... 

例:だから

Timmy, 9/13/17 06:00:00, Data1... 
Timmy, 9/13/17 04:00:00, Data2... 
Timmy, 9/13/17 07:00:00, Data3... 
Timmy, 9/12/17 14:00:00, Data4... 

、私は時間を開始し、表2にすべてのレコードを取得する必要がありますこれは、すべての名前のために行われる必要がある(これが複数存在することができ、表1に日付範囲内ではありませんT1/T2の名前が一致しています(T2のデータ列は異なります)。それは、右側に限定して、左側に包括的でなければならない。

だからこのクエリのために、私はそのが参加した場合、私は気にしない

Timmy, 9/13/17 04:00:00, Data2... 
Timmy, 9/13/17 07:00:00, Data3... (Inclusive on end date) 

を見てみたいです。私は余分な列を削除することができます。私は重複を見たくない。私はまた、私が(StartHour> = StartDateとStartHour < EndDate)でないかどうかチェックするところで問題を打ち続ける。だから、表2の各行/ startHourは、表1の名前と一致するすべての行に対してチェックする必要があります。私はそれに対処できません。サブクエリが必要だと思いますが、分かりません。

範囲内にあるかどうかを確認しますが、範囲内にある場合は除外したいので否定します(排他的)。

+0

出力で示した2つのレコードは、実際にはTable1の開始日と終了日の間にあります。これら2つのレコードを削除したいのですか? – Vashi

+0

@Vashi申し訳ありませんが、多分私は台無しにしました。最初のレコードは、表1の範囲の後に1を記録します。表1の範囲の前にあり、2を記録する。 2番目に返されたレコードは、T1レコード1の後とT1レコード2の後(終了日は含まれていません)ですので、T1 R2は07:00に終了し、返された結果2は07:00に開始します(終了日、だから大丈夫です)。 – Future44

答えて

0

私のソリューションを試みました:何のヌルが存在しないところ

SELECT * 
FROM T1 LEFT JOIN T2 
ON T1.Name = T2.Name 
AND NOT (T2.StartHour >= T1.StartDate AND T2.StartHour < T2.EndDate) 

は、それからちょうどつかみます。

条件文は、T2からの行がT1行1では偽であり、T1行2,3,4では偽と評価されます。実際には真であるため、4つの結果が返されます。または、T1のすべての行を調べないため、正しく評価されません。

0

table1と一致するtable2のすべてのエントリについて、条件違反の回数を計算することができます。また、1度でも違反している場合は、出力には不要にします。これは、以下のクエリでSUM(CASE WHEN..)を使用して行います。除外と包含ルールを1として

SELECT T2.NAME, T2.STARTHOUR, T2.DATA 
FROM 
TABLE1 T1 
INNER JOIN 
TABLE2 T2 
ON T1.NAME = T2.NAME 
GROUP BY T2.NAME, T2.STARTHOUR, T2.DATA 
HAVING SUM(CASE WHEN T2.STARTHOUR >= T1.STARTDATE AND T2.STARTHOUR < T1.STARTDATE THEN 1 ELSE 0 END) = 0; 

、あなたは表2のstarthourは、TABLE1のenddateと同じである場合、ルールに違反していないことがわかります。

0

このクエリを使用できます。

SELECT DISTINCT T2.* 
FROM Table2 T2 
WHERE 
    NOT EXISTS (SELECT * FROM Table1 T1 WHERE 
     T1.Name = T2.Name 
     AND T2.StartHour > T1.StartDate 
     AND T2.StartHour < T1.EndDate) 
関連する問題