【问题标题】:Convert a Numeric(19,0) Value to a DateTime将 Numeric(19,0) 值转换为 DateTime
【发布时间】:2019-03-20 05:44:27
【问题描述】:

我有一个数值为 1868570243000000 的数字 (19,0) 字段。

DB 文档称该字段是“一个 EMR 生成的 ID,指示项目的签署时间。”

如何将其转换为 DateTime 值?

我已经尝试了一些类似的方法:

select dateadd(s, convert(bigint, 1868570243000) / 1000, convert(datetime, '1-1-1970 00:00:00'))

但我必须先删除 3 个零,然后它才能起作用。

并且...它给了我这个:2029-03-18 23:17:23.000

当我期待这个时:2019-03-18 23:17:23.000

月份、日期和时间是正确的 - 但它是未来 10 年!

提前致谢!!

【问题讨论】:

    标签: tsql


    【解决方案1】:

    当前日期的纪元时间为1553023530,而您的值为1868570243(未来十年)。

    您可能想在此处验证您的数据和/或方法Epoch Converter

    只是为了好玩,试试:

    Select OddValue   = dateadd(SECOND, 1868570243000 / 1000, '1970-01-01 00:00:00')
          ,EpochValue = dateadd(SECOND, 1552951043000 / 1000, '1970-01-01 00:00:00')
          ,Delta      = (1868570243000 - 1552951043000) / 1000
    

    你会得到

    OddValue                  EpochValue                Delta
    2029-03-18 23:17:23.000   2019-03-18 23:17:23.000   315619200.000000
    

    【讨论】:

    • 嗨,约翰!谢谢你的帮助。我确实运行了您发送的 sql 并看到了您的意思。但是我的问题没有解决——可能是因为我说的不够清楚或不够准确。
    • 当我对 numeric(19,0) 字段中的值运行此 sql 时,我得到了该字段的正确日期。是否可以调整此语句以给我一个 DateTime 值而不仅仅是一个日期:选择 Cast(DateAdd(d, (Cast(1868570243000000/1000000 As Int) / 3600 / 24), '1960') As Date) As DocDate
    • @Talay 您当然可以使用 1960-01-01,但这会影响您的其他数据吗? 1960 年的时代似乎很奇怪。
    • 没有。我不好没有立即发现它。在这个特定的 DB 中,为所有用作 DateTime 字段的 Numeric (19, 0) 字段规定了 1960。我承认,在这种情况下,我从未听说过“时代”这个词。我是一名前英语文学教授,所以试图将“Epoch”这个词放入 t-sql 世界对我来说有点扭曲!!道歉,再次感谢!
    • @Talay 不道歉。这是有趣的部分。我是一名前酒店经营者:)
    【解决方案2】:

    非常感谢@John Cappelletti 的帮助!衷心感谢!

    这是我结合您给我的内容和我过去使用过的其他代码得出的解决方案:

    Select DateAdd(SECOND, 1868570243000000 / 1000000, '1960') As Full_Time
    

    这给了我想要的东西。

    再次感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多