Prawie wszystkie odpowiedzi i komentarze były bardzo mocne dla zalet i lekkie dla wad. Oto podsumowanie wszystkich dotychczasowych zalet i wad oraz niektóre kluczowe wady (w punkcie 2 poniżej), o których widziałem tylko raz lub wcale.
- Plusy:
1.1 Bardziej zgodny z ISO (ISO 8601) (choć nie wiem, jak to się dzieje w praktyce).
1.2 Większy zakres (1/1/0001 do 12/31/9999 vs. 1/1 / 1753-12 / 31/9999) (chociaż dodatkowy zakres, wszystkie przed rokiem 1753, prawdopodobnie nie będzie stosowany, z wyjątkiem np. w aplikacjach historycznych, astronomicznych, geologicznych itp.).
1.3 Dokładnie pasuje do zakresu zakresu typu .NET DateTime
(chociaż oba konwertują tam iz powrotem bez specjalnego kodowania, jeśli wartości mieszczą się w zakresie i precyzji typu docelowego, z wyjątkiem Con # 2.1 poniżej, w przeciwnym razie wystąpi błąd / zaokrąglenie).
1.4 Większa precyzja (100 nanosekund, czyli 0,000,000,1 sek. Vs. 3,33 milisekunda, czyli 0,003,33 sek.) (Chociaż dodatkowa precyzja prawdopodobnie nie zostanie wykorzystana, z wyjątkiem np. Aplikacji inżynierskich / naukowych).
1.5 Po skonfigurowaniu dla podobnej (jak w 1 milisek nie „takiej samej” (jak w 3,33 milisek), jak twierdzi Iman Abidi) precyzji, ponieważ DateTime
zużywa mniej miejsca (7 vs 8 bajtów), ale wtedy oczywiście straciłbyś precyzja korzyści, która prawdopodobnie jest jedną z dwóch (druga to zakres) najbardziej reklamowana, choć prawdopodobnie niepotrzebnymi korzyściami).
- CONS:
2.1 Podczas przekazywania parametru do .NET SqlCommand
, musisz określić, System.Data.SqlDbType.DateTime2
czy możesz przekazać wartość poza DateTime
zakresem i / lub precyzją SQL Servera , ponieważ domyślnie jest to System.Data.SqlDbType.DateTime
.
2.2 Nie można go niejawnie / łatwo przekonwertować na zmiennoprzecinkową wartość liczbową (liczbę dni od minimalnej daty i godziny), aby wykonać następujące czynności w wyrażeniach programu SQL Server za pomocą wartości liczbowych i operatorów:
2.2.1 dodaj lub odejmij # dni lub częściowe dni. Uwaga: użycie DateAdd
funkcji jako obejścia nie jest trywialne, gdy trzeba rozważyć wiele, jeśli nie wszystkie części daty i godziny.
2.2.2 weź pod uwagę różnicę między dwiema datami dla celów obliczenia „wieku”. Uwaga: Zamiast tego nie można po prostu użyć DateDiff
funkcji programu SQL Server , ponieważ nie oblicza się, age
jak większość ludzi by się spodziewała, gdyby dwie daty i godziny przekroczyły granicę daty / godziny kalendarza / zegara jednostek określonych, nawet jeśli to tylko ułamek tej jednostki, zwróci różnicę jako 1 tej jednostki w stosunku do 0. Na przykład, DateDiff
w Day
dwóch datach tylko 1 milisekunda od siebie zwróci 1 w stosunku do 0 (dni), jeśli te daty są w różne dni kalendarzowe (tj. „1999-12-31 23: 59: 59.9999999” i „2000-01-01 00: 00: 00.0000000”). Ta sama różnica 1 milisekundy data-godzina, jeśli zostanie przeniesiona tak, aby nie przekraczała dnia kalendarzowego, zwróci „DateDiff” w Day
wartości 0 (dni).
2.2.3 weź Avg
pod uwagę daty i godziny (w zapytaniu zbiorczym), po prostu konwertując najpierw na „Float”, a następnie ponownie na DateTime
.
UWAGA: Aby przekonwertować DateTime2
na wartość liczbową, musisz zrobić coś w rodzaju następującej formuły, która nadal zakłada, że twoje wartości nie są mniejsze niż w roku 1970 (co oznacza, że tracisz cały dodatkowy zakres plus kolejne 217 lat. Uwaga: Możesz nie można po prostu dostosować formuły, aby umożliwić dodatkowy zasięg, ponieważ możesz napotkać problemy z przepełnieniem numerycznym.
25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0
- Źródło: „ https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html ”
Oczywiście, można też Cast
na DateTime
pierwszy (i ewentualnie z powrotem do DateTime2
), ale trzeba by stracić dokładność i zasięg (wszystkie poprzedzające rok 1753) Korzyści z DateTime2
vs. DateTime
które są naprawde 2 największe i również w tym samym czasie prolly 2 najmniej prawdopodobne potrzeby, które nasuwają pytanie, po co z niego korzystać, gdy tracisz niejawną / łatwą konwersję na zmiennoprzecinkową liczbę (liczbę dni) w celu dodania / odjęcia / korzyści związanych z wiekiem (vs. DateDiff
) / Avg
cieląt, która jest duża z mojego doświadczenia.
Przy okazji, Avg
data jest ważnym (lub przynajmniej powinna być) ważnym przypadkiem użycia. a) Oprócz użycia w uzyskiwaniu średniego czasu trwania, gdy daty i godziny (od wspólnej podstawowej daty i godziny) są używane do reprezentowania czasu trwania (powszechna praktyka), b) przydatne jest również uzyskanie statystyki typu deski rozdzielczej na temat średniej daty czas znajduje się w kolumnie daty i godziny zakresu / grupy wierszy. c) Standardowe (lub przynajmniej powinno być standardowe) zapytanie ad-hoc do monitorowania / rozwiązywania problemów z wartościami w kolumnie, które mogą nie być ważne / już dłużej i / lub mogą wymagać wycofania, to podać dla każdej wartości liczbę wystąpień oraz (jeśli są dostępne), że Min
, Avg
i Max
znaczków data-czas związany z tą wartością.