2009-07-24 7 views
3

Je cherche une fonction SQL Server efficace (dans mon cas 2005) pour convertir une valeur de temps unix en une date SQL Server, en utilisant l'heure locale (en particulier en tenant compte de l'heure d'été ajustements - à-dire non seulement l'ajout 01/01/1970 en secondes)Fonction SQL Server pour convertir l'heure Unix en datetime local

+0

Veuillez utiliser "SQL Server" pour désigner le produit et le serveur SQL dans le tag. Évite la confusion avec "MySql", et MSSQL n'existe pas. –

+2

Il n'y a peut-être pas un tel produit, techniquement, mais c'est une abréviation très utilisée et vous nagez à contre-courant là-bas. Une recherche sur Google renvoie neuf millions et demi de hits, dont le premier est la page d'accueil du serveur Microsoft sql – Cruachan

Répondre

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

Une fois que vous avez la date, vous pouvez maintenant faire dateadd à la date en fonction de l'état DST pour la date de retour. Pour vérifier l'heure d'été, vous avez besoin d'une forme de fonction, exemple:

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 

Vous avez besoin d'une fonction Simular à trouver quand l'heure d'été se termine, un coup d'oeil sur ce site pour plus d'informations: http://www.mssqltips.com/tip.asp?tip=1372

+0

Heure locale, cela ne tient pas compte des ajustements d'été – Cruachan

+0

J'ai édité la réponse pour inclure un exemple de fonction qui donnera vous informations sur DST et quand il commence. Vous pouvez ensuite utiliser un CAS dans votre instruction SQL pour ajouter les heures requises à la colonne de sortie. – Espo

1

mieux?

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 
Questions connexes