Datenbank my_table
:Oracle SQL Überschneidungen zwischen Beginn und Enddatum in 2 oder mehreren Datensätze
id seq start_date end_date
1 1 01-01-2017 02-01-2017
1 2 07-01-2017 09-01-2017
1 3 11-01-2017 11-01-2017
2 1 20-01-2017 20-01-2017
3 1 01-02-2017 02-02-2017
3 2 03-02-2017 04-02-2017
3 3 08-01-2017 09-02-2017
3 4 09-01-2017 10-02-2017
3 5 10-01-2017 12-02-2017
Meine Forderung ist das erste Datum (in der Regel seq 1 Startdatum) und Enddatum (normalerweise letztes Seq Ende zu bekommen Datum) und die Anzahl der Daten, die während aller seq für jede eindeutige ID aufgetreten sind.
eingetreten:
id 1 2 3
01-01-2017 20-01-2017 01-02-2017
02-01-2017 02-02-2017
07-01-2017 03-02-2017
08-01-2017 04-02-2017
09-01-2017 08-02-2017
11-01-2017 09-02-2017
10-02-2017
11-02-2017
12-02-2017
total 6 1 9
Hier ist das Ergebnis Ich möchte:
id start_date end_date num_date
1 01-01-2017 11-01-2017 6
2 20-01-2017 20-01-2017 1
3 01-02-2017 12-02-2017 9
I
SELECT id
, MIN(start_date)
, MAX(end_date)
, SUM(end_date - start_date + 1)
FROM my_table
GROUP BY id
und diese SQL-Anweisung funktionieren in id 1 und 2 versucht haben seit Es gibt kein Überschneidungsdatum zwischen Anfangsdatum und Enddatum. Aber für ID 3 ist das Ergebnis num_date
11. Könnten Sie bitte die SQL-Anweisung vorschlagen, um dieses Problem zu lösen? Vielen Dank. Eine weitere Frage: Das Datum in der Datenbank ist in datetime
Format. Wie konvertiere ich es in date
. Ich habe versucht, TRUNC
Funktion zu verwenden, aber es manchmal Datum zu gestern umwandeln.
Ist das die einzige Art möglich überlappen das Enddatum eines Intervalls gleich dem Startdatum der nächsten in Ihrer Daten? Oder können sich zwei Intervalle für mehr als einen Tag überschneiden? – mathguy
Es wird keine Überschneidungsintervalle geben. – lvlack
Können Sie ein Beispiel angeben, bei dem TRUNC ein Datum mit Uhrzeit auf GESTERN kürzt? Ich habe das nie gesehen (und ehrlich gesagt glaube ich es nicht). – mathguy