【问题标题】:Strange date format in database数据库中奇怪的日期格式
【发布时间】:2018-11-17 02:52:18
【问题描述】:

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

【问题讨论】:

  • 正如之前在其他问题上多次提到的,将 DATETIME 数据存储在非 DATETIME 数据类型中绝不是一个好主意
  • @Mazhar 我怀疑 OP 很清楚这一点......
  • 如果您可以自己输入一些数据,请尝试使用“幻数”:尝试 1900 年 1 月 1 日、00:00、1900 年 1 月 2 日、00:00、1900 年 1 月 2 日 01:00等等....查找数据的存储方式。
  • 好主意,但不幸的是这些是系统生成的,所以我没有任何工具可以输入幻数。
  • 我能得到的最好的结果是这两个相隔两秒的日期时间

标签: tsql datetime hex converter


【解决方案1】:

您的十六进制值按照您的假设进行分隔(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 毫秒。

【讨论】:

  • 太棒了@iamdave!你先生是个天才!非常感谢!
猜你喜欢
  • 2017-10-23
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多