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

Преобразувайте DateTime в шестнадесетичен еквивалент във VB.NET

Този отговор просто адресира преобразуването на .NET DateTimes в двоичен формат, който е еквивалентен на datetime на SQL Server тип данни, така че вярвам, че е достатъчно различен, за да изисква отделен отговор (отметнах тук и тук за да сте сигурни, че е наред).

Както посочи @Martin Smith, двоичният формат на datetime не е просто брой отметки от определен момент във времето.

datetime се съхранява като 8 байта, като първите 4 байта са броят на дните от 01.01.1900 г., а вторите 4 байта са броят на "отметките" от полунощ на този ден, където отметката е 10/3 милисекунди.

За да преобразуваме .NET DateTime в еквивалентно двоично представяне, трябва да определим броя на дните от '01-01-1900', да го преобразуваме в шестнадесетичен и след това броя на тиковете от полунощ, което е малко сложно, тъй като .NET тик е 100ns.

Например:

DateTime dt = DateTime.Now;
DateTime zero = new DateTime(1900, 1, 1);

TimeSpan ts = dt - zero;
TimeSpan ms = ts.Subtract(new TimeSpan(ts.Days, 0, 0, 0));

string hex = "0x" + ts.Days.ToString("X8") + ((int)(ms.TotalMilliseconds/3.33333333)).ToString("X8");

Когато изпълних този код, dt беше 9/14/2011 23:19:03.366 и задава hex до 0x00009F5E01804321 , което се преобразува в 2011-09-14 23:19:03.363 в SQL Server.

Вярвам, че винаги ще имате проблем с получаването на точната дата поради закръгляване, но ако можете да използвате заявка, при която датата и часът не трябва да съвпада точно, до милисекунда, това може да е достатъчно близо.

Редактиране

В моя коментар под първия отговор, който публикувах, попитах за SQL Server 2008, защото datetime2 типът данни съхранява време с точност от 100ns (поне го прави с точността по подразбиране), което съвпада добре с .NET. Ако се интересувате как това се съхранява на двоично ниво в SQL Server, вижте моят отговор към по-стар въпрос.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проактивни проверки на състоянието на SQL Server, част 4:ERRORLOG

  2. Премахване на дублиращи се редове (въз основа на стойности от множество колони) от SQL таблица

  3. Актуализиране на нулева стойност на колона от ненулева стойност в предишния ред

  4. Как да инсталирате Azure Data Studio на Mac

  5. Как да изпишем съхранени процедури във файлове?