1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Mit Tagen arbeiten

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von IchHH, 22 November 2018.

  1. IchHH

    IchHH Datenbank-Guru

    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.
     
  2. IchHH

    IchHH Datenbank-Guru

    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.
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     
  4. IchHH

    IchHH Datenbank-Guru

    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
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
  6. IchHH

    IchHH Datenbank-Guru

    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?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden