Mit Tagen arbeiten

IchHH

Datenbank-Guru
Beiträge
284
Hallo,

ich suche gerade eine Möglichkeit nach den Unterschied zwischen zwei Datumsbereichen zu suchen.

Mit DateDiff dachte ich die Lösung gefunden zu haben.

Mein Lösungsansatz happert aber, wie immer, an der Ausführung.

Im Grunde soll mein Code wie folgt aussehen:
Code:
Datediff(day, Between [dbo].[vz_1].[vz_versich_beginn] And [dbo].[vz_1].[vz_versich_ende]) > 30

Ziel ist also den Unterschied zwischen Beginn und Ende zu ermitteln, jedoch nur dann wenn dieser größer 30 Tage ist. Da es sich um mehrere Spalten für ein Sachverhalt handelt ist es eben etwas komplizierter. Finde ich.
 
Werbung:
Sorry der richtige Code würde natürlich

Code:
Datediff(DAY,[vz_1].[vz_versich_ende],[Query1].[vz_versich_beginn]) > 30

heißen. Allerdings bekomme ich da zuviele Datensätze ausgegeben die mit meinem DateDiff ansich nichts zutun haben. Woran kann das liegen? Ich habe nämlich die Datenbank ein zweites Mal eingebunden um den Vergleich zu machen.
 
Nun das hängt zu 100% davon ab was in deinen Datensätzen steht.
Code:
select datediff(day,'2018-12-22 16:54:27.463','2018-11-22 16:54:27.463')
liefert z.B. -30 Tage, du hast ja das Ende vorm Anfang. Aber am Ende zählt was der Datensatz liefert und die Funktion tut was man ihr sagt.
 
Hallo ukulele,

ja daran habe ich garnicht gedacht. Allerdings ist das Ergebnis noch immer nicht befriedigend. Wenn ich Beispielsweise in einer Spalte die Differenz zwischen Enddatum und Anfangsdatum berechne habe ich damit nicht mein Ziel erreicht. Wenn ich also bei einem Kunden der mehrere VON - BIS Datumsbereiche hat, die zudem evtl. aufeinander aufbauen, wie z.B. 01.06.2015-30.06.2015 und 01.07.2015 - 16.10.2015 und 14.12.2015 - 31.12.2016. Dann soll der Server mir ja eigentlich eine 1 ausgeben, dass hier nämlich das Datediff > 31 Tage ist. Nur wie mache ich das am besten?

Grüße aus Hamburg
 
Ich glaube ich verstehe jetzt was du suchst.

Der Server denkt zunächst mal zeilenbasiert, eine Zeile = ein Datensatz. Wenn du also mehrere Zeiträume in einer Tabelle als mehrere Zeilen speicherst ist das für datediff() egal, er betrachtet immer nur die Differenz zwischen zwei Werten in der selben Zeile.

Wenn du jetzt sagst alle Datensätze eines Kunden gehören zusammen könnte man mit min() und max() und einer Gruppierung arbeiten:
Code:
SELECT kundeID,datediff(day,min(start),max(ende)) AS differenz FROM tabelle

Willst du nur Zeiträume die aufeinander folgen zusammen betrachten musst du diese Datensätze erstmal "verketten", also effektiv joinen. Da du selbst sagst das können mehrere Zeiträume werden macht hier eigentlich nur CTE Sinn und es wird ein bischen anspruchsvoller.
 
Das ist eine feine Sache, den Code werde ich bestimmt noch mal brauchen nur leider nicht in diesem Fall. Denn ich kann nie davon ausgehen, dass die Zeiträume immer aufeinander liegen. Denn wenn ich es richtig verstanden habe, würde er mir im folgenden Fall für ein und den selben Kunden
Beginn Ende
01.11.2015 - 10.12.2015
06.10.2015 - 31.10.2015
01.08.2015 - 31.08.2015
01.04.2015 - 30.06.2015
01.03.2015 - 31.03.2015
01.01.2015 - 07.01.2015
08.01.2015 - 28.02.2015

sagen das die Differenz größer 31 ist. Das stimmt zwar auch allerdings nicht aufgrund des 01.01.2015 und des 12.12.2015 sondern aufgrund der Lücke zwischen den 31.08.2015 und 06.10.2015. Das ermittelt der code aber nicht, habe ich das richtig verstanden?
 
Werbung:
was genau willst Du jetzt berechnen?

Mal mit PG simuliert:

Code:
test=*# select * from ich_hh ;
         von_bis         
-------------------------
 [2015-11-01,2015-12-10)
 [2015-10-06,2015-10-31)
 [2015-08-01,2015-08-31)
 [2015-04-01,2015-06-30)
 [2015-03-01,2015-03-31)
 [2015-01-01,2015-01-07)
 [2015-01-08,2015-02-28)
(7 rows)

test=*# select von_bis, lower(von_bis) - upper(lag(von_bis) over (order by von_bis)) as differenz from ich_hh order by lower(von_bis);
         von_bis         | differenz
-------------------------+-----------
 [2015-01-01,2015-01-07) |         
 [2015-01-08,2015-02-28) |         1
 [2015-03-01,2015-03-31) |         1
 [2015-04-01,2015-06-30) |         1
 [2015-08-01,2015-08-31) |        32
 [2015-10-06,2015-10-31) |        36
 [2015-11-01,2015-12-10) |         1
(7 rows)

test=*#

Da sind also 2 Datensätze, wo die "Lücke" größer als 31 Tage ist:

Code:
test=*# with diff as (select von_bis, lower(von_bis) - upper(lag(von_bis) over (order by von_bis)) as differenz from ich_hh order by lower(von_bis)) select * from diff where differenz > 31;
         von_bis         | differenz
-------------------------+-----------
 [2015-08-01,2015-08-31) |        32
 [2015-10-06,2015-10-31) |        36
(2 rows)

test=*#

DATERANGE kannst Du ja nicht nutzen, aber das Window-Funktionen hast Du ja auch, ist nur mehr Schreibaufwand, vermutlich ...
 
Zurück
Oben