Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren Sie das SQL Server DateTime-Objekt in BIGINT (.Net-Ticks)

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