【问题标题】:What date format is this? (001281379300724)这是什么日期格式? (001281379300724)
【发布时间】:2012-07-19 23:17:40
【问题描述】:

如果可能,需要在 SQL Server 中将此时间戳 (001281379300724) 转换为 YYYY-MM-DD hh:mm:ss 格式。有什么建议吗?

【问题讨论】:

  • 如果我们大致知道您从哪里获得“时间戳”、“时间戳”是如何创建的等等,将会有所帮助...
  • 自 UNIX 时代以来很可能是几秒钟。在您链接的示例中,这将是 2010 年 8 月 9 日星期一 18:41:40 GMT。
  • 是自 1971 年以来的毫秒数? UNIX 时间
  • 这看起来像一个 unix 时间戳。见this answer
  • @nightcracker 注意位数。我认为 RyanGray 可能是对的。 1281379300724 毫秒将是 2010 年 8 月,但 1281379300724 整秒将是 40,000 多年后。

标签: sql-server datetime


【解决方案1】:

这假定时间戳是自 UNIX 纪元以来的 ms。它仅转换为最接近的秒数,但您可以向其添加 ms(见下文)。它必须使用两个步骤,因为 dateadd 需要一个 int。首先除以 60000 添加分钟,然后添加秒。

DECLARE @yournum bigint
SET @yournum = 1281379300724     
SELECT DATEADD(ss, (@yournum / 1000)%60 , (DATEADD(mi, @yournum/1000/60, '19700101')))

 2010-08-09 18:41:40.000

要获得毫秒精度:(糟糕,可能是更好的方法)

DECLARE @yournum bigint
SET @yournum = 1281379300724     
SELECT DATEADD(ms, (@yournum%1000),DATEADD(ss, (@yournum / 1000)%60 , (DATEADD(mi, @yournum/1000/60, '19700101'))))

给予

2010-08-09 18:41:40.723

【讨论】:

    【解决方案2】:

    简单的答案是,如果这是一个 SQL 时间戳列(a.k.a rowversion),则不能。根据该类型的文档:

    每个数据库都有一个计数器,每次插入或 对包含 数据库中的 rowversion 列。这个计数器是数据库 行版本。这跟踪数据库中的相对时间,而不是 可以与时钟关联的实际时间。

    ...

    Transact-SQL 时间戳数据类型与时间戳不同 ISO 标准中定义的数据类型。

    【讨论】:

      【解决方案3】:

      这样你可以稍微靠近一点:

      SELECT DATEADD(MINUTE, 1281379300724/1000/60, '19700101')
      

      结果:

      2010-08-09 18:41:00.000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        相关资源
        最近更新 更多