数据库中奇怪的日期格式

Strange date format in database

我在 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 格式)

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

使用您的 000B3E54h0221CBFEh - 07/06/2018 09:56:09 值将其转换为:

日期部分:000B3E54
整数值:736852

时间部分:0221CBFE
整数值:35769342

然后将这些整数值作为天添加到日期 0001/01/00(SQL 服务器无法处理,因此下面的 +/-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 值的明智使用,以确保正确的毫秒数为 output/returned,因为 SQL 服务器 datetime 仅精确到最接近的 3 毫秒.