Biorąc pod uwagę następujące elementy
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Jaki jest najlepszy sposób na połączenie ich w celu uzyskania DATETIME2(7)
wyniku o wartości '2013-10-13 23:59:59.9999999'
?
Niektóre rzeczy, które nie działają, są wymienione poniżej.
SELECT @D + @T
Data typu argumentu operand jest niepoprawna dla operatora dodawania.
SELECT CAST(@D AS DATETIME2(7)) + @T
Operand typ danych datetime2 jest niepoprawny dla operatora dodawania.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Funkcja datowania spowodowała przepełnienie. Liczba elementów daty oddzielających dwa wystąpienia daty / godziny jest zbyt duża. Spróbuj użyć daty z mniej dokładną datą.
* Przepełnienia można uniknąć w usłudze Azure SQL Database i SQL Server 2016 za pomocą DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Typy danych data i godzina są niezgodne w operatorze dodawania.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Zwraca wynik, ale traci precyzję
2013-10-13 23:59:59.997
W przypadku SQL Server 2012 i nowszych dostępna jest funkcja DATETIME2FROMPARTS . Ma ten formularz:
Dla danych przykładowych staje się
Co skutkuje w
Części można uzyskać za pomocą DATEPART (), jeśli zaczynamy od czasowych typów danych lub z tekstu użytego do skonstruowania przykładowych wartości w pytaniu.
źródło
To głupie, że SQL Server nie pozwala, aby twój pierwszy przykład działał, i to też wydaje się naprawdę głupie, ale…
źródło
źródło
Kiedy tu wylądowałem, szukałem czegoś innego. Pytanie jest dość stare, ale ostatnio pojawiły się komentarze i działania. Pomyślałem, że podzielę się prostą metodą, która jest bardzo podobna do odpowiedzi udzielonej przez @Atario, ale nieco krótsza, a niektóre mogą być łatwiejsze do odczytania:
źródło
Możesz obciąć rzutem do DATE, aby obciąć, a następnie z powrotem do DATETIME, aby dodać CZAS
źródło