none
Beschreibung von datediff und datediff_big RRS feed

  • Frage

  • Hallo,

    mir ist aufgefallen, dass in der Beschreibung beider Funktionen dasselbe für den Rückgabewert steht:

    For millisecond, the maximum difference between startdate and enddate is 24 days, 20 hours, 31 minutes and 23.647 seconds. For second, the maximum difference is 68 years.

    Das ist für datediff richtig, da es ein int ist, aber für datediff_big falsch, da bigint viel größere Zahlen verarbeiten kann.

    Aber wie teilt man das Microsoft mit?

    Gruß

    Willi

    Freitag, 4. Mai 2018 12:45

Antworten

Alle Antworten

  • So ganz wird das wohl nicht stimmen:

    http://sqlhints.com/2015/12/12/difference-between-datediff-and-datediff_big-functions-in-sql-server/

    Freitag, 4. Mai 2018 14:40
  • Genau das sage ich doch!

    Freitag, 4. Mai 2018 15:07
  • Das heißt zwar nicht, dass die 68 Jahre nun überschritten werden können, du aber 68 Jahre nun in Millisekunden umrechnen kannst.

    Aber es gibt doch Unterschiede:

    SELECT DATEDIFF(MILLISECOND,
     '12/01/2015','12/30/2015')
     AS 'Difference in MILLISECOND'

    RESULT:

    Msg 535, Level 16, State 0, Line 1
    The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.

    SELECT DATEDIFF_BIG(MILLISECOND,
     '12/01/2015','12/30/2015')
    AS 'Difference in MILLISECOND'

    RESULT:
    Difference in MILLISECOND
    ————————-
    2505600000

    Das heißt zwar nicht, dass die 68 Jahre nun überschritten werden können, du aber 68 Jahre nun in Millisekunden umrechnen kannst. Somit sind die Grenzen nun (fast?) erreichbar.


    Freitag, 4. Mai 2018 15:42
  • Eben und weil es Unterschiede gibt sollte Microsoft in die Beschreibung nicht dasselbe schreiben. Das ist alles was ich bemängele.

    Das ist wahrscheinlich durch Kopieren der Beschreibung von datediff nach datediff_big entstanden.

    Freitag, 4. Mai 2018 15:53
  • Willi geht es, wenn ich ihn richtig verstanden, nicht um die Funktionen an sich sondern um die falsche Beschreibung in der Doku zu DATEDIFF_BIG.

    SELECT DATEDIFF(     S, '19000101', '20180101' )
    SELECT DATEDIFF_BIG( S, '19000101', '20180101' )


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 4. Mai 2018 15:56
    Moderator
  • Also wenn ich das so sehe, ist 2018 - 1900 deutlich mehr als 68 Jahre.
    D.h., dass mehr als 68 Jahre eben auch Bigint bei Sekunden übersteigt.

    Das Problem ist eher, dass die Gegenfunktion DateAdd_Big nicht existiert um das zu verifizieren.

    Aber lass dir doch das Ergebnis der Differenz zwischen 1900 und 1968 mal anzeigen.

    https://docs.microsoft.com/de-de/sql/t-sql/functions/datediff-big-transact-sql?view=sql-server-2017

    "Wenn der Rückgabewert außerhalb des Bereichs für int liegt (–9.223.372.036.854.775.808 bis +9.223.372.036.854.775.807), wird ein Fehler zurückgegeben. Der maximale Unterschied zwischen startdate und enddate beträgt für millisecond 24 Tage, 20 Stunden, 31 Minuten und 23,647 Sekunden. Für second beträgt der maximale Unterschied 68 Jahre."
    Da fehlt nur Bigint statt int, der Wert ist aber Typ Bigint.

    Um also größere Differenzen zu berechnen solltest du den Typ Decimal (38,0) verwenden und in 68-Jahr-Schritten (Function DateDiffDecimal) zusammenrechnen. Bigint ist ja nur 19 stellig (genau nur 18, die 19. ist ja nur +/- 9).
    Da hast du die doppelte Genauigkeit und das 10^19 * 68 Jahre in Sekunden oder 10^19 * 24 Tage in Millisekunden.
    Die Umkehrfunktion DateAddDecimal() solltest du dann aber auch schreiben;-).


    Freitag, 4. Mai 2018 16:14
  • Also wenn ich das so sehe, ist 2018 - 1900 deutlich mehr als 68 Jahre.
    D.h., dass mehr als 68 Jahre eben auch Bigint bei Sekunden übersteigt.

    Das Problem ist eher, dass die Gegenfunktion DateAdd_Big nicht existiert um das zu verifizieren.

    Der Wert bei SELECT DATEDIFF_BIG( S, '19000101', '20180101' ) stimmt schon, das ist nicht das Problem.

    Die Doku dazu ist nur falsch. Der maximale Unterschied für millisecond beträgt eben nicht 24 Tage ..., der für second auch nicht 68 Jahre, sondern halt erheblich mehr.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Freitag, 4. Mai 2018 16:30
    Moderator
  • Hallo Willi,

    das geht ganz einfach, oben rechts mit "Bearbeiten".

    Nach einer Revision wird der Text geändert!

    HTH!


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Montag, 7. Mai 2018 06:04
  • Ich habe den Artikel mal etwas überarbeitet und hoffe, dass die Änderung dann demnächst erfolgt.

    Die mögliche Größe des Rückgabewerts überschreitet den tatsächlich benötigten Bereich. Die Einschränkung gilt nicht mehr für diese BIG-Funktion!
    SELECT DATEDIFF_BIG(MILLISECOND, cast('1753-01-01' as datetime),'9999-12-31') AS 'Difference in MILLISECOND';
    gibt einen Wert zurück , der noch 4 Zehnerpotenzen unter dem möglichen Wert liegt. 


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Montag, 7. Mai 2018 10:06
  • Danke

    Dienstag, 8. Mai 2018 14:25