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]不计算闰秒
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)
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
jmo*_*ico 19
如果有人因为unix时间戳而得到" 将表达式转换为数据类型int的算术溢出错误 "是bigint(而不是int),则可以使用:
SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
FROM TABLE
使用unix时间戳替换实际列的硬编码时间戳
来源:MSSQL bigint Unix时间戳到日期时间,以毫秒为单位
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
这样做:
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能够保持微秒精度.
添加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。如果时间以毫秒为单位并且需要保留它们:
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)
| 归档时间: |
|
| 查看次数: |
232705 次 |
| 最近记录: |