Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуване на SQL Server DateTime обект в BIGINT (.Net тикчета)

Обсъждах дали да публикувам това, защото зависи от това как датите се съхраняват на двоично ниво в SQL Server и затова е много крехко решение. За нещо различно от еднократно преобразуване, бих използвал нещо като отговора, който @Solution Evangelist публикува. Все пак може да ви се стори интересно по академичен начин, така че все пак ще го публикувам.

Използване на факта, че точността на DateTime2 съвпада с продължителността на отметката в .NET и че и двете се основават на начални дати на 01-01-0001 00:00:00.0000000 , можете да предавате DateTime до DateTime2 , и след това го прехвърляте към binary(9) :0x07F06C999F3CB7340B

Информацията за датата и часа се съхранява в RTL, така че обръщайки се, ще получим 0x0B34B73C9F996CF007 .

Първите три байта съхраняват броя на дните след 01-01-0001 и следващите 5 байта съхраняват тиковете от 100 ns от полунощ на този ден, така че можем да вземем броя на дните, да умножим по тиковете в един ден и да добавим тиковете, представляващи времето, изминало за деня.

Изпълнение на следния код:

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]

връща следните резултати:

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

Вземане на върнатия брой Ticks и преобразуване обратно в DateTime в .NET:

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

Връща ни датата от 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. Как работи функцията FORMAT() в SQL Server (T-SQL)

  2. Има ли разлика между DECIMAL и NUMERIC в SQL Server?

  3. Неочаквано поведение @@rowcount в UDF в MS SQL 2019

  4. Върнете типа на DML тригер на таблица в SQL Server

  5. SQL заявка за получаване на данни за последните 3 месеца