Ich habe überlegt, ob ich dies posten soll, weil es davon abhängt, wie Daten auf der Binärebene in SQL Server gespeichert werden, und daher eine sehr spröde Lösung ist. Für alles andere als eine einmalige Konvertierung würde ich so etwas wie die Antwort verwenden, die @Solution Evangelist gepostet hat. Trotzdem könntest du das auf akademische Art interessant finden, also poste ich es trotzdem.
Unter Ausnutzung der Tatsache, dass die Genauigkeit von DateTime2
mit der Tick-Dauer in .NET übereinstimmt und dass beide auf Startdaten von 01-01-0001 00:00:00.0000000
basieren , können Sie DateTime
umwandeln zu DateTime2
, und wandeln Sie es dann in binary(9)
um :0x07F06C999F3CB7340B
Die datetime-Informationen werden RTL gespeichert, also erhalten wir umgekehrt 0x0B34B73C9F996CF007
.
Die ersten drei Bytes speichern die Anzahl der Tage seit 01-01-0001
und die nächsten 5 Bytes speichern die 100-ns-Ticks seit Mitternacht dieses Tages, sodass wir die Anzahl der Tage nehmen, mit den Ticks eines Tages multiplizieren und die Ticks hinzufügen können, die die für den Tag verstrichene Zeit darstellen.
Ausführen des folgenden Codes:
set @date = getdate()
set @ticksPerDay = 864000000000
declare @date2 datetime2 = @date
declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)
select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]
gibt die folgenden Ergebnisse zurück:
DateTime DateTime2 Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000
Nehmen Sie die zurückgegebene Anzahl von Ticks und konvertieren Sie sie in .NET zurück in eine DateTime:
DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();
Gibt uns das Datum vom SQL-Server zurück:
2011-09-12 07:20:32.5870000