数据库中奇怪的日期格式

时间:2018-06-07 08:55:47

标签: tsql datetime hex converter

我在SQL数据库中有一些非常奇怪的18字符字母数字日期时间,它们似乎使用十六进制?

我可以通过使用它们的应用程序找出日期是什么,但我一直在寻找通过查询转换它们的方法。你知道怎么用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 :(得分:0)

您的十六进制值按照您的假设(将h用作分隔符)分开,并表示要添加到基线datetime值的整数值。

使用000B3E54h0221CBFEh - 07/06/2018 09:56:09值将其翻译为:

日期部分: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毫秒。