Ich bin auf der Suche nach einer effizienten SQL Server-Funktion (in meinem Fall 2005), um einen Unix-Zeitwert in eine SQL Server Datetime zu konvertieren, mit lokaler Zeit (insbesondere unter Berücksichtigung der Sommerzeit Anpassung - gerade dh nicht 01.01.1970 in Sekunden) ZugabeSQL Server-Funktion zum Konvertieren von Unix-Zeit zu lokalen Datetime
Antwort
SELECT DATEADD(second, @ts, {d '1970-01-01'}) as MSSQLdatetime
Nachdem Sie das Datum haben, können Sie nun über den Zeitpunkt für das zurückgegebene Datum auf dem DST-Zustand abhängig machen dateadd. Um zu überprüfen, für DST müssen Sie irgendeine Form von Funktion, Beispiel:
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
Sie benötigen eine simular Funktion zu finden, wenn die Sommerzeit endet, werfen Sie einen Blick auf dieser Website für weitere Informationen: http://www.mssqltips.com/tip.asp?tip=1372
Lokale Zeit, dies berücksichtigt keine Sommerzeitanpassungen. – Cruachan
Ich habe die Antwort so bearbeitet, dass sie eine Beispielfunktion enthält Sie Informationen über die Sommerzeit und wann es beginnt. Sie können dann einen CASE in Ihrer SQL-Anweisung verwenden, um der Ausgabespalte die erforderlichen Stunden hinzuzufügen. – Espo
besser?
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
Verwenden Sie bitte "SQL Server", um auf das Produkt und den SQL-Server im Tag zu verweisen. Vermeidet Verwirrung mit "MySql", und MSSQL gibt es nicht. –
Es gibt vielleicht kein solches Produkt, aber es ist eine sehr häufig verwendete Abkürzung und Sie schwimmen dort gegen den Strom. Eine Suche auf Google gibt neuneinhalb Millionen Zugriffe zurück, von denen der erste die Microsoft SQL Server-Homepage ist. – Cruachan