2014-11-04 12 views
11

Mam następujące zapytanie:SQL Server: DateDiff funkcja spowodowało przepełnienie podczas korzystania milisekundy

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

Kiedy wykonać to, pojawia się błąd: „. Funkcja DateDiff spowodowało przepełnienie liczby datepartów oddzielających dwie instancje daty/czasu jest zbyt duża. Spróbuj użyć datatedart z mniej dokładnym datepartem. "

Kiedy zmienić zapytanie do następujących działa dobrze:

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

Problemem jest to, że naprawdę muszę milisekundy, jak również.

+2

DATEDIFF zwraca liczbę całkowitą, która po prostu nie jest wystarczająco duża, aby pomieścić wynik. Jedynym sposobem, jaki mogę wymyślić, to ustalenie, ile dni upływa między tymi datami, a następnie porównanie tylko części czasowych tych dwóch dat w celu sprawdzenia, ile jest różnicy milisekund, i dodanie tych dwóch razem (pomnożenie liczby dni przez liczbę milisekund w ciągu dnia). – Alan

+1

Uwaga boczna: Czy pracujesz w obszarze, który stosuje oszczędności w ciągu dnia? Ponieważ w wielu miejscach nastąpiło przejście między włączaniem/wyłączaniem czasu letniego w danym okresie, a SQL Server nie bierze tego pod uwagę. Możesz więc uzyskać wynik "dokładny" do milisekundy, ale wyłączony o całą godzinę. –

+0

czy któraś z odpowiedzi rozwiązała Twój problem? Jeśli tak, proszę zaakceptować –

Odpowiedz

16

Przez milisekundę maksymalna różnica między datą początkową a końcową wynosi 24 dni, 20 godzin, 31 minut i 23,647 sekund. zobacz http://msdn.microsoft.com/en-us/library/ms189794.aspx

Jeśli potrzebujesz milisekundy powyżej tego poziomu, musisz napisać coś niestandardowego.

3

Nie musisz odnosić się do milisekund w swoich obliczeniach.

to zrobi dokładnie taka sama jak skryptu wyjątkiem przelewu:

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

nieco później odpowiedzi, ale może pomóc. W SQL 2016 MS wprowadziła funkcję DATEDIFF_BIG, która będzie (w zależności od rozmiaru) przepełniona różnicą większą niż coś podobnego do 290k lat. Ale technet artykule mają taką samą różnicę czasu jako podstawowego DateDiff - https://msdn.microsoft.com/en-us/library/mt628058.aspx

+0

Niesamowite, nie wiedziałem o tym dodatku w 2016. Trochę wcześnie, żebyśmy zaczęli go używać, ale dobrze wiedzieć, że jest na horyzoncie :) – defines

2

Dla mnie nie był to duży odstęp pomiędzy dwiema datami tak Użyłem poniżej kod

zadeklarować @timetagInMillsecond bigint = wylewane (wylewane (obsady (@ timetag jak datetime) -'1970-01-01' AS dziesiętny (38,10)) * 24 * 60 * 60 * 1000 + 0.5 jako bigint)

To działa na mnie.

Powiązane problemy