【问题标题】:Convert bigint to datetime将 bigint 转换为日期时间
【发布时间】:2011-04-08 16:44:00
【问题描述】:

我想将一个值从 bigint 转换为 datetime。

例如,我正在阅读 teamcity serverHISTORY 表。在 build_start_time_server 字段中,我在一条记录 1283174502729 上有此值。

如何将其转换为日期时间值?

【问题讨论】:

  • 我更改了标签以希望使它们更具体。请注意,如果您在标记字段中使用“sql server”,这将位于 sql 标记以及 server 标记下,但不在 sql-server 下 标签,这可能是你想要的。
  • 您希望 1283174502729 的日期时间值是多少?
  • 同意@krock。由于您的问题并非特定于您想要的 SQL 实现(例如:sql-server),因此这里有很多答案不适用,具体取决于 SQL 的风格。

标签: sql sql-server tsql teamcity


【解决方案1】:

这对你有用吗?它目前在 SQL Server 2005 上返回 30-8-2010 13:21:42:

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

我已经除以 1000,因为 dateadd 函数不适用于这么大的数字。所以你确实会损失一点精度,但使用起来要简单得多。

【讨论】:

    【解决方案2】:

    略有不同的方法:

    你的场景:

    SELECT dateadd(ms, 1283174502729 / 86400000, (1283174502729 / 86400000) + 25567)
    FROM yourtable
    

    通用代码:

    SELECT dateadd(ms, yourfield / 86400000, (yourfield / 86400000) + 25567)
    FROM yourtable
    

    输出:

    August, 30 2010 00:00:14
    

    SQL 小提琴:http://sqlfiddle.com/#!3/c9eb5a/2/0

    【讨论】:

      【解决方案3】:
      CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp]) / 1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME)
      

      【讨论】:

      • 我仍然不明白投票否决。有错误吗?这适用于 2008R2。效率低吗?如果我不知道要改进什么,我该如何改进。
      • 我认为反对票是为了提供仅代码的答案,而没有任何解释它在做什么或为什么起作用。
      【解决方案4】:

      以下内容考虑了新的 SQL 术语并将返回毫秒(也可以修改以用于计算字段。)[SQL Server 2012 或更高版本]

      declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000'
      , @milliseconds bigint = 1283174502729
      , @MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000
      
      SELECT  DATEADD(MILLISECOND, TRY_CAST(@milliseconds % @millisecondsPerDay AS 
      INT), DATEADD(DAY, TRY_CAST(@milliseconds / @millisecondsPerDay AS INT), 
      @StartDate));
      

      【讨论】:

        【解决方案5】:

        选择 Cast(Cast(19980324 as nvarchar) as Datetime)

        【讨论】:

          【解决方案6】:

          如果您希望保持以毫秒为单位的精度,那么您可以执行以下操作。适用于 SQL Server 2016

          SELECT dateadd(ms, ((CONVERT(bigint, build_start_time_server)%1000)), 
                 dateadd(ss, ((CONVERT(bigint, build_start_time_server)/1000)%60), 
                 dateadd(mi, ((CONVERT(bigint, build_start_time_server)/1000)/60), '1970-01-01'))) FROM yourtable
          

          我得到的答案是

          Monday, August 30, 2010 1:21 PM
          

          【讨论】:

            【解决方案7】:

            要将 bigint 转换为 datetime/unixtime,您必须在转换为时间戳之前将这些值除以 1000000 (10e6)。

            SELECT
                 CAST( bigIntTime_column / 1000000 AS timestamp) example_date
            FROM example_table
            

            简单易用的解决方案,不需要导入任何添加的库或函数

            【讨论】:

              【解决方案8】:
              DATEADD(second,YourValue, CAST('1970-01-01 00:00:00' AS datetime))
              

              【讨论】:

              • 投反对票。 “将表达式转换为数据类型 int 时出现算术溢出错误。”使用问题中提供的数据。
              • 尽管稍作调整,它还是可以工作的,也许发帖人可以解决一下? (赞成鼓励他一点:))
              【解决方案9】:

              你试过FROM_UNIXTIME吗?

              select from_unixtime('your_field') from 'your_table'
              

              https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_from-unixtime

              为我工作。

              【讨论】:

                猜你喜欢
                • 2019-10-03
                • 2014-03-09
                • 2021-05-16
                • 2021-10-26
                • 1970-01-01
                • 2010-11-23
                • 1970-01-01
                • 2020-09-07
                • 1970-01-01
                相关资源
                最近更新 更多