2009-07-24 47 views
3

我正在寻找一个高效的SQL Server函数(在我的情况下为2005),用于将使用本地时间的unix时间值转换为SQL Server日期时间(特别考虑到夏令时调整 - 即不只是在几秒钟内将01/01/1970)将Unix时间转换为本地日期时间的SQL Server函数

+0

请使用“SQL Server”来引用标记中的产品和sql-server。避免与“MySql”混淆,并且没有MSSQL这样的东西。 – 2009-07-24 12:15:27

+2

在技术上可能没有这样的产品,但它是一种非常常用的折叠,而且你在那里游泳。在谷歌搜索返回九百五十万点击,其中第一个是微软SQL服务器主页 – Cruachan 2009-07-24 12:27:57

回答

2
SELECT DATEADD(second, @ts, {d '1970-01-01'}) as MSSQLdatetime 

后你有约会,你现在可以做DATEADD上取决于DST状态返回的日期。要检查DST你需要某种形式的功能,样品:

CREATE function [dbo].[fn_GetDaylightSavingsTimeStart] 
(@Year varchar(4)) 
RETURNS smalldatetime 
as 
begin 
declare @DTSStartWeek smalldatetime, @DTSEndWeek smalldatetime 
set @DTSStartWeek = '03/01/' + convert(varchar,@Year) 
return case datepart(dw,@DTSStartWeek) 
when 1 then 
    dateadd(hour,170,@DTSStartWeek) 
when 2 then 
    dateadd(hour,314,@DTSStartWeek) 
when 3 then 
    dateadd(hour,290,@DTSStartWeek) 
when 4 then 
    dateadd(hour,266,@DTSStartWeek) 
when 5 then 
    dateadd(hour,242,@DTSStartWeek) 
when 6 then 
    dateadd(hour,218,@DTSStartWeek) 
when 7 then 
    dateadd(hour,194,@DTSStartWeek) 
end 
end 

你需要一个simular功能找到DST结束时,看看这个网站获取更多信息: http://www.mssqltips.com/tip.asp?tip=1372

1

更好?

CREATE FUNCTION [dbo].[UnixTimestampToGMTDatetime] 
(@UnixTimestamp bigint) 
RETURNS datetime 
AS 
BEGIN 
     DECLARE @GMTDatetime datetime 
     select @GMTDatetime = 
     CASE 
     WHEN dateadd(ss, @UnixTimestamp/1000, '1970-01-01') 
     BETWEEN 
      Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))) + '-03-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))/4 + 4) % 7)) + ' 01:00:00', 20) 
     AND 
      Convert(DATETIME, Convert(VARCHAR(4), Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))) + '-10-' + Convert(VARCHAR(2), (31 - (5 * Year(dateadd(ss, @UnixTimestamp/1000, '1970-01-01'))/4 + 1) % 7)) + ' 02:00:00', 20) 
     THEN Dateadd(hh, 1, dateadd(ss, @UnixTimestamp/1000, '1970-01-01')) 
     ELSE Dateadd(hh, 0, dateadd(ss, @UnixTimestamp/1000, '1970-01-01')) 
     END 
RETURN @GMTDatetime  
END