Benutzer mit den meisten Antworten
Beschreibung von datediff und datediff_big

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
Antworten
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 10. Mai 2018 10:22
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 22. Mai 2018 13:54
Alle Antworten
-
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
————————-
2505600000Das 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.
-
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 -
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;-).- Bearbeitet Der Suchende Freitag, 4. Mai 2018 16:16
-
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
- Bearbeitet Stefan FalzModerator Freitag, 4. Mai 2018 16:32
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 10. Mai 2018 10:22
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 22. Mai 2018 13:54
-
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