Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj obiekt SQL Server DateTime na BIGINT (takty .Net)

Zastanawiałem się, czy to opublikować, ponieważ zależy to od tego, jak daty są przechowywane na poziomie binarnym w SQL Server, a więc jest to bardzo kruche rozwiązanie. W przypadku czegokolwiek innego niż jednorazowa konwersja, użyłbym czegoś podobnego do odpowiedzi, którą opublikował @Solution Evangelist. Mimo to możesz uznać to za interesujące z naukowego punktu widzenia, więc i tak to opublikuję.

Wykorzystując fakt, że dokładność DateTime2 pasuje do czasu trwania tiku w .NET i że oba są oparte na datach początkowych 01-01-0001 00:00:00.0000000 , możesz rzutować DateTime do DateTime2 , a następnie rzutuj go na binary(9) :0x07F06C999F3CB7340B

Informacje o dacie i godzinie są przechowywane w formacie RTL, więc odwracając, otrzymamy 0x0B34B73C9F996CF007 .

Pierwsze trzy bajty przechowują liczbę dni od 01-01-0001 a następne 5 bajtów przechowuje 100 ns tików od północy tego dnia, więc możemy wziąć liczbę dni, pomnożyć przez tiki w dniu i dodać tiki reprezentujące czas, który upłynął w ciągu dnia.

Wykonywanie następującego kodu:

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]

zwraca następujące wyniki:

DateTime                DateTime2              Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000

Pobranie zwróconej liczby Ticków i konwersja z powrotem na DateTime w .NET:

DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();

Zwraca nam datę z serwera sql:

2011-09-12 07:20:32.5870000



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak włączyć wszystkie ograniczenia sprawdzania w bazie danych SQL Server — samouczek SQL Server / TSQL, część 88

  2. Jak dodać kolumnę tożsamości do tabeli za pomocą TSQL i GUI w SQL Server - SQL Server / T-SQL Tutorial, część 40

  3. Jak stworzyć bazę danych w SQL Server

  4. SQL Server:Szybkie zapytania, ale wolne od procedury

  5. Count(*) vs Count(1) — SQL Server