Ваши шестнадцатеричные значения разделены, как вы и предполагали (с h
, используемым в качестве разделителя), и представляют целочисленные значения для добавления к базовому значению date
и time
.
Использование вашего *Значение 1006 * это переводится как:
Часть даты: 000B3E54
Целочисленное значение: 736852
Часть времени: 0221CBFE
Целочисленное значение: 35769342
Эти целочисленные значения затем добавляются в виде дней к дате 0001/01/00
(которую SQL Server не может обработать, следовательно, +/- 1 ниже) и миллисекунд к 00:00:00
соответственно, которые вы можете увидеть, работая вэтот сценарий:
select convert(int, 0x000B3E54) as DateIntValue
,dateadd(day,convert(int, 0x000B3E54)-1,cast('00010101' as datetime2)) as DateValue
,convert(int, 0x0221CBFE) as TimeIntValue
,cast(dateadd(millisecond,convert(int, 0x0221CBFE),cast('19000101' as datetime2)) as time) as TimeValue
,cast(datediff(day,cast('00010101' as datetime2),'20180607')+1 as binary(4)) as DateHexValue
,cast(datediff(millisecond,cast('20180607' as date),cast('2018-06-07 09:56:09.342' as datetime2)) as binary(4)) as TimeHexValue
который выводит:
+--------------+-----------------------------+--------------+------------------+--------------+--------------+
| DateIntValue | DateValue | TimeIntValue | TimeValue | DateHexValue | TimeHexValue |
+--------------+-----------------------------+--------------+------------------+--------------+--------------+
| 736852 | 2018-06-07 00:00:00.0000000 | 35769342 | 09:56:09.3420000 | 0x000B3E54 | 0x0221CBFE |
+--------------+-----------------------------+--------------+------------------+--------------+--------------+
Обратите внимание на разумное использование значений datetime2
, чтобы обеспечить вывод / возврат нужного количества миллисекунд в качестве SQL Server datetime
точен только с точностью до 3 миллисекунд.