2009-07-24 15 views
3

効率的なSQL Server機能(私の場合は2005年)を使用して、UNIX時刻の値をローカル時刻を使用してSQL Serverの日時に変換します(特にサマータイム調整 - すなわち、わずか数秒で1970年1月1日を追加していない)Unixの時刻をローカルの日時に変換するSQL Serverの機能

+0

「SQL Server」を使用して、タグ内の製品とsql-serverを参照してください。 "MySql"との混乱を避け、MSSQLのようなものはありません。 –

+2

技術的にそのような製品はないかもしれませんが、非常に一般的に使用されている撲滅であり、あなたはそこで潮を泳いでいます。 Googleでの検索では950万回のヒットが返され、そのうちの最初の1つはMicrosoft SQL Serverのホームページ – Cruachan

答えて

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

日付を持っていたら、今戻った日付のDSTの状態に応じて、日にDATEADD行うことができます。

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 

あなたはDSTが終了したときに見つけることがまね機能を必要とするが、詳細は、このサイトを見てみましょう: http://www.mssqltips.com/tip.asp?tip=1372

+0

現地時間、これは夏時間の調整を考慮に入れません – Cruachan

+0

答えを編集して、あなたはDSTとそれが始まるときについての情報をあなたに伝えます。その後、SQL文でCASEを使用して、必要な時間を出力列に追加することができます。 – Espo

1

より良いDSTをチェックするには、いくつかの機能、サンプルの形式を必要ですか?

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 
関連する問題