数据库中奇怪的日期格式
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
作为分隔符)并表示要添加到基线 date
和 time
值的整数值。
使用您的 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 毫秒.
我在 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
作为分隔符)并表示要添加到基线 date
和 time
值的整数值。
使用您的 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 毫秒.