2009-07-24 37 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 
相關問題