Gegeben die folgenden Komponenten
DECLARE @D DATE = '2013-10-13'
DECLARE @T TIME(7) = '23:59:59.9999999'
Wie lassen sie sich am besten kombinieren, um ein DATETIME2(7)
wertvolles Ergebnis zu erzielen '2013-10-13 23:59:59.9999999'
?
Einige Dinge, die nicht funktionieren, sind unten aufgeführt.
SELECT @D + @T
Das Datum des Operandendatentyps ist für den Operator add ungültig.
SELECT CAST(@D AS DATETIME2(7)) + @T
Der Operandendatentyp datetime2 ist für den Operator add ungültig.
SELECT DATEADD(NANOSECOND,DATEDIFF(NANOSECOND,CAST('00:00:00.0000000' AS TIME),@T),@D)
Die Datediff-Funktion führte zu einem Überlauf. Die Anzahl der Datumsteile, die zwei Datums- / Uhrzeitinstanzen trennen, ist zu groß. Versuchen Sie, Datediff mit einem weniger genauen Datum zu verwenden.
* Der Überlauf kann in Azure SQL Database und SQL Server 2016 mithilfe von vermieden werden DATEDIFF_BIG
.
SELECT CAST(@D AS DATETIME) + @T
Die Datentypen datetime und time sind im Operator add nicht kompatibel.
SELECT CAST(@D AS DATETIME) + CAST(@T AS DATETIME)
Gibt ein Ergebnis zurück, verliert aber an Genauigkeit
2013-10-13 23:59:59.997
Für SQL Server 2012 und höher gibt es die Funktion DATETIME2FROMPARTS . Es hat diese Form:
Für die angegebenen Beispieldaten wird dies
was in ... endet
Die Teile können mit DATEPART () abgerufen werden, wenn Sie von temporären Datentypen oder von dem Text ausgehen, der zum Erstellen der Beispielwerte in der Frage verwendet wird.
quelle
Es ist ziemlich dumm von SQL Server, Ihr erstes Beispiel nicht funktionieren zu lassen, und das wird auch wirklich dumm erscheinen, aber ...
quelle
quelle
Ich habe nach etwas anderem gesucht, als ich hier gelandet bin. Die Frage ist ziemlich alt, aber es gibt einige aktuelle Kommentare und Aktivitäten. Ich dachte, ich würde eine einfache Methode teilen, die der Antwort von @Atario sehr ähnlich ist, aber ein bisschen kürzer und einige könnten leichter zu lesen sein:
quelle
Sie können das mit Cast auf DATE kürzen, um es zu kürzen, und dann zurück auf DATETIME, um die TIME hinzuzufügen
quelle