28. april 2004 - 20:45Der 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 :)
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.
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!
Synes godt om
Ny brugerNybegynder
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.