Avatar billede ahlforn Nybegynder
28. april 2004 - 20:45 Der er 3 kommentarer og
1 løsning

Unix timestamp til mssql datetime

Hej,

jeg er ved at lave en user defined function i MSSQL der omregner et unix timestamp til en dato i datetime format. Indtil videre er det gået ganske fint, men der er dog lidt problemer.

Problemet kom fra en lidt uventet vinkel...sommer/vinter tid...!

ALTER FUNCTION dbo.from_unixtime
    (
    @input int
    )
RETURNS datetime
AS
    BEGIN
        declare @base datetime set @base = '1970-01-01 01:00:00'
        declare @output datetime set @output = dateadd(ss, @input, @base)       
    RETURN @output
    END

Jeg er bruger et offset på en 1 da timestamps'ne bliver lavet i UTC tid.

Mit problem er at når jeg tager en dato som 2004-03-28 00:00:00 som i unix timestamp er 1080428400 og konvertere det med min funktion, virker det helt fint og jeg får den rigtige dato ud. Men når jeg tager dagen efter, altså 2004-03-29 00:00:00 som giver 1080511200 i unix timestamp, så virker min funktion ikke helt så godt og returnerer 2004-03-28 23:00:00.

Nu er forskellen på de to datoer at d. 28 er vintertid og d. 29 er sommertid. Da sommer og vinter tid ikke skifter på samme dato hvert år, men f.eks. på den sidste søndag i marts, så er det lidt svært at lave en defination på det. Og er det det samme i andre lande?

Er der en som sidder med en fed løsning på dette problem, eller endnu bedre..har en 100% fungerende konverterings funktion, så vil jeg blive sindsygt glad. På forhånd tak :)
Avatar billede trer Nybegynder
06. maj 2004 - 12:01 #1
Hvornår man skifter vinter/sommertid er en ISO standard - men om alle lande følger den... det er så lige det.  Men du kan nok få lidt hjælp fra følgende funktion i SQL Server:

GETUTCDATE()
Returns the datetime value representing the current UTC time (Universal Time Coordinate or Greenwich Mean Time). The current UTC time is derived from the current local time and the time zone setting in the operating system of the computer on which SQL Server is running.

Du skal så være obs på, at GetUTCdate() er nondeterministisk - dvs. du kan ikke kalde den direkte i en funktion.  Løsningen er at kalde funktionen i et view og derefter læse fra viewet i din funktion.

Dvs. du sætter et view op der returnerer forskellen mellem GetUTCdate() og GetDate() - dermed har du din korrekte offset.
Avatar billede wappaw Nybegynder
10. juni 2004 - 01:01 #2
Jeg har prøvet følgende i SQL Query Analyzer :


    BEGIN
        declare @base datetime
    set @base = '1970-01-01 01:00:00'

        declare @outputDatetime datetime
    set @outputDatetime = dateadd(ss, 1080518400 , convert(datetime, @base))       
   
    declare @outputUnixTimestamp int
    set @outputUnixTimestamp = datediff(ss, convert(datetime, @base),convert(datetime,'03/29/2004'))
   
    print @outputDatetime
    print @outputUnixTimestamp
    END

------------------------------------------------------------------------------

Resultat :

Mar 29 2004  1:00AM
1080514800
Avatar billede trer Nybegynder
10. juni 2004 - 20:37 #3
Hvis du trækker GETDATE() fra GETUTCDATE() bør du få forskellen mellem dansk tid og UTC tid - dvs. 1 time om vinteren og 2 timer om sommeren.

Det bruger du så til at lave din base. Derefter er den øvrige konverting som du beskriver ovenfor.
Avatar billede ahlforn Nybegynder
01. oktober 2004 - 02:32 #4
Så er det vist på tide at lukke spørgsmålet...nogle brugbare svar fik jeg ikke, men der findes ikke nogen helt perfekt løsning så vidt jeg har fundet frem til!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester