如何在SQL Server中将bigint(UNIX时间戳)转换为datetime?

sal*_*man 93 sql sql-server datetime timestamp date

如何在SQL Server中将UNIX时间戳(bigint)转换为DateTime?

Dan*_*tle 264

这对我有用:

Select
    dateadd(S, [unixtime], '1970-01-01')
From [Table]
Run Code Online (Sandbox Code Playgroud)

如果任何人想知道为什么1970-01-01,这被称为大纪元时间.Below是来自维基百科的引用

自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数,[1] [注1]不计算闰秒

  • 这应该标记为正确.我希望每次登陆这里都能再次提出这个答案:) (12认同)
  • 此解决方案会受到 2038 年问题的影响,因为 dateadd 函数需要一个 int 类型。文档说“数字参数不能超过 int 的范围。” https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql https://en.wikipedia.org/wiki/Year_2038_problem (8认同)
  • @BenDundee 我真的同意你的看法。多么优雅的解决方案。我四处寻找公式,最后确定了一个公式,但一周后我开始遇到错误时不得不再次搜索。谢天谢地,我在第二次复飞时找到了这个。 (4认同)
  • 我一直在使用这个解决方案。这个格式化的日期与其他数据连接在一起,所以我有一个 varchar ......简单!无需费心在应用程序中格式化这些日志。但是,出现了一些疯狂的时区问题!我的日期使用的是 UTC 时区而不是客户的时区 :( (2认同)
  • @Whitecat不知道你是否已经解决了问题,但是看看外壳!也许你的数据库整理设置被设置为'SQL_Latin1_General_CP1_CS_AS',CS就是这里的关键字.它代表"CaseSensitiv",因此您的代码必须与套管匹配!另一点可能是你的系统是MySql,而不是名称是date_add().问候 ;) (2认同)
  • 请注意,此函数返回的日期/时间将是 UTC,而不是本地日期/时间。转换为本地是底部的真正痛苦。 (2认同)
  • 由于时间戳不再“适合”int,这会导致算术溢出 (2认同)

KM.*_*KM. 55

尝试:

CREATE FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT;
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime)))
END;
GO
Run Code Online (Sandbox Code Playgroud)

  • -1表示UTC->本地转换.它没有正确处理夏令时.对我来说,这是误导. (11认同)
  • +1用于UTC->本地转换.请注意,如果您尝试在2月份的6月10日翻译,夏季/冬季仍将关闭. (2认同)
  • 它对我不起作用.我正在尝试使用1517270400000并收到此错误:将表达式转换为数据类型int的算术溢出错误. (2认同)
  • 也有溢出,通常意味着涉及毫秒,简单地解决为: select dbo.fn_ConvertToDateTime( src_column/1000 ) from src_table; (2认同)

SQL*_*ace 22

像这样

将Unix(纪元)日期时间添加到基准日期(以秒为单位)

这将是现在(2010-05-25 07:56:23.000)

 SELECT dateadd(s,1274756183,'19700101 05:00:00:000')
Run Code Online (Sandbox Code Playgroud)

如果你想反向,请看看这个http://wiki.lessthandot.com/index.php/Epoch_Date

  • 为什么是 05:00:00 而不是 00:00:00? (2认同)
  • @Svisstack 5小时用于时区差异。5:00:00表示他是格林尼治标准时间5个小时 (2认同)

jmo*_*ico 19

如果有人因为unix时间戳而得到" 将表达式转换为数据类型int的算术溢出错误 "是bigint(而不是int),则可以使用:

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01') FROM TABLE

使用unix时间戳替换实际列的硬编码时间戳

来源:MSSQL bigint Unix时间戳到日期时间,以毫秒为单位

  • 谢谢 。这应该被投票1462924862735870900次!!!!!!!!!!!!!!!!!!!!! (2认同)
  • 您的号码采用科学计数法@TiyebM。它不是一个整数值(它有小数) (2认同)

Moh*_*day 12

测试这个:

数据库服务器:

SELECT dateadd(S, timestamp, '1970-01-01 00:00:00') 
     FROM 
your_table
Run Code Online (Sandbox Code Playgroud)

MySql服务器:

SELECT
  from_unixtime(timestamp) 
FROM 
  your_table
Run Code Online (Sandbox Code Playgroud)

http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php


Ovi*_*rar 7

这样做:

declare @UNIX_TIME int
select @UNIX_TIME = 1111111111
-- Using dateadd to add seconds to 1970-01-01
select [Datetime from UNIX Time] = dateadd(!precision!,@UNIX_TIME,'1970-01-01')
Run Code Online (Sandbox Code Playgroud)

而不是!精确!根据时间戳的精度使用:ss,ms或mcs.Bigint能够保持微秒精度.


Sal*_*n A 5

添加n秒 to1970-01-01将为您提供UTC 日期,因为n是 Unix 时间戳,是自 00:00:00 协调世界时 (UTC), 1970 年 1 月 1 日星期四以来经过的秒数

在 SQL Server 2016 中,您可以使用AT TIME ZONE. 您只需要知道 Windows 标准格式的时区名称:

SELECT *
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
CROSS APPLY (SELECT DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC') AS CA1(UTCDate)
CROSS APPLY (SELECT UTCDate AT TIME ZONE 'Pacific Standard Time') AS CA2(LocalDate)
Run Code Online (Sandbox Code Playgroud)

或者干脆:

SELECT *, DATEADD(SECOND, UnixTimestamp, '1970-01-01') AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time'
FROM (VALUES (1514808000), (1527854400)) AS Tests(UnixTimestamp)
Run Code Online (Sandbox Code Playgroud)
| UnixTimestamp | UTCDate                    | LocalDate                  |
|---------------|----------------------------|----------------------------|
| 1514808000    | 2018-01-01 12:00:00 +00:00 | 2018-01-01 04:00:00 -08:00 |
| 1527854400    | 2018-06-01 12:00:00 +00:00 | 2018-06-01 05:00:00 -07:00 |
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您可以通过强制转换DATETIMEOFFSET来切断时区信息DATETIME
  • 转换考虑了夏令时。太平洋时间是 2018 年 1 月的 UTC-08:00 和 2018 年 6 月的 UTC-07:00。


got*_*tqn 5

如果时间以毫秒为单位并且需要保留它们:

DECLARE @value VARCHAR(32) = '1561487667713';

SELECT DATEADD(MILLISECOND, CAST(RIGHT(@value, 3) AS INT) - DATEDIFF(MILLISECOND,GETDATE(),GETUTCDATE()), DATEADD(SECOND, CAST(LEFT(@value, 10) AS INT), '1970-01-01T00:00:00'))
Run Code Online (Sandbox Code Playgroud)