我在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
格式)
答案 0 :(得分:0)
您的十六进制值按照您的假设(将h
用作分隔符)分开,并表示要添加到基线date
和time
值的整数值。
使用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毫秒。