2014-11-04 4 views
11

Ich habe die folgende Abfrage:SQL Server: datediff Funktion in einem Überlauf in Folge bei der Verwendung von MILLISECOND

select CONVERT(varchar(12), DATEADD(MILLISECOND, DateDiff(MILLISECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114) 

Wenn ich dies ausführen, erhalte ich die Fehlermeldung:. „Die datediff Funktion in einem Überlauf führte die Nummer von Datateilen, die zwei Datums-/Zeitinstanzen voneinander trennen, ist zu groß. Versuchen Sie, datediff mit einem weniger genauen Datumsteil zu verwenden. "

Wenn ich die Abfrage an die es funktioniert folgende ändern fein:

select CONVERT(varchar(12), DATEADD(SECOND, DateDiff(SECOND, '2014-08-04 10:37:28.713','2014-11-04 08:21:17.723'), 0), 114) 

Das Problem ist, dass ich wirklich die Millisekunde als auch benötigen.

+2

DATEDIFF gibt eine Ganzzahl zurück, die einfach nicht groß genug ist, um das Ergebnis zu speichern. Der einzige Weg, an den ich denken könnte, wäre herauszufinden, wie viele Tage zwischen den beiden Daten liegen, dann vergleiche nur die Zeitabschnitte der beiden Daten, um herauszufinden, wie viele Millisekunden der Unterschied ist, und addiere die beiden zusammen (multipliziert die Anzahl der Tage mit der Anzahl der Millisekunden an einem Tag). – Alan

+1

Seitennotiz: Arbeiten Sie in einem Bereich, in dem eine Art von Tageslicht eingespart wird? Da an vielen Orten während der von Ihnen betrachteten Zeit ein Wechsel zwischen Sommerzeit und Sommerzeit stattgefunden hat, wird dies von SQL Server nicht berücksichtigt. Sie könnten also ein Ergebnis erhalten, das genau auf die Millisekunde, aber eine ganze Stunde lang genau ist. –

+0

hat eine der Antworten Ihr Problem gelöst? Wenn dies der Fall ist, akzeptieren Sie bitte –

Antwort

16

Für die Millisekunde beträgt die maximale Differenz zwischen Startdatum und Enddatum 24 Tage, 20 Stunden, 31 Minuten und 23,647 Sekunden. siehe http://msdn.microsoft.com/en-us/library/ms189794.aspx

Wenn Sie Millisekunde über dieser Ebene benötigen, müssen Sie etwas Brauchbares schreiben.

3

Sie müssen sich nicht auf die Millisekunden in Ihrer Berechnung beziehen.

Dies macht genau das gleiche wie das Skript mit Ausnahme des Überlaufes:

SELECT CONVERT(varchar(12), 
     CAST('2014-11-04 08:21:17.723' as datetime) - 
     CAST('2014-08-04 10:37:28.713' as datetime) 
     , 114) 
12

Etwas später Antwort aber helfen kann. In SQL 2016 führte MS die Funktion DATEDIFF_BIG ein, die (je nach Schriftgröße) in Differenz größer als etwa 290k Jahre überläuft. Aber technet Artikel haben gleiche Zeitdifferenz als Grund DATEDIFF - https://msdn.microsoft.com/en-us/library/mt628058.aspx

+0

Ehrfürchtig, ich war mir dieses Zusatzes im Jahr 2016 nicht bewusst. Etwas früh für uns, es zu benutzen, aber gut zu wissen, dass es am Horizont ist :) – defines

2

Für mich gibt es ein großes Intervall zwischen zwei Terminen war, so habe ich unten Code verwendet

erklären @timetagInMillsecond Bigint = CAST (CAST (cast (@ timetag als Datetime) -'1970-01-01' dezimal AS (38,10)) * 24 * 60 * 60 * 1000 + 0,5 als Bigint)

Es funktioniert für mich.