Странный формат даты в базе данных - PullRequest
0 голосов
/ 07 июня 2018

У меня есть несколько очень странно выглядящих 18-символьных буквенно-цифровых дат в базе данных SQL, они, кажется, используют шестнадцатеричный код?

Я могу узнать, какие даты есть в приложении, которое их использует, но я искал способ преобразовать их с помощью запроса.Знаете ли вы, как я мог бы конвертировать их с помощью TSQL?

000B3E4Bh01F2D947h - 29/05/2018 09:04:52
000B3E0Dh03A16C1Eh - 23/05/2018 10:22:26
000B3E4Eh0248C3D8h - 01/06/2018 10:38:43
000B3E4Eh0249B449h- 01/06/2018 10:39:44

Я предполагаю, что дата и время разделены, как показано ниже, но я не знаю, чтобы преобразовать отдельные части, если кто-то может помочь с этим?Спасибо!!

000B3E4Eh (дата) - 0249B449h (время)

(даты в формате dd/mm/yyyy)

1 Ответ

0 голосов
/ 07 июня 2018

Ваши шестнадцатеричные значения разделены, как вы и предполагали (с 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 миллисекунд.

...