Welcome to Sign in | Join | Help
in Search

timezone offset and dst

Last post 03-06-2012, 8:51 PM by tebbaerty. 12 replies.
Sort Posts: Previous Next
  •  03-05-2012, 8:29 PM 9148

    timezone offset and dst

    Salut,

    Sunt inca incepator pe aceasta parte. Cum se poate, doar folosind sqlserver, sa deduc timezone-ul serverului si dupa aceea sa obtin diferenta de ore dintre acesta si un alt timezone dar sa se tina cont si de DST.

    Mentionez ca folosesc sqlserver 2008.

    Am gasit cateva functii cum ar fi
    SWITCHOFFSET
    SYSDATETIMEOFFSET

    Dar nu stiu cum sa le folosesc astfel incat sa stie sa tina cont si de DST.
    Ma puteti ajuta cu un exemplu si cateva explicatii ?

    mersi,
  •  03-05-2012, 8:47 PM 9149 in reply to 9148

    Re: timezone offset and dst

    Vezi daca te ajuta
    http://www.mssqltips.com/sqlservertip/2339/converting-utc-to-local-time-with-sql-server-clr/
  •  03-05-2012, 8:57 PM 9150 in reply to 9149

    Re: timezone offset and dst

    l-am vazut, l-am citit.
    Nu pot folosi clr din pacate. Trebuie sa fie doar sql.

    Am gasit http://www.mssqltips.com/sqlservertip/1372/daylight-savings-time-functions-in-sql-server/ care te ajuta sa stii daca este activat DST sau nu. Folosind aceasta functie, cred ca pot folosi si SWITCHOFFSET. Functia asta primeste un parametru time_zone.

    conform cu msdn time_zone : "Is a character string in the format [+|-]TZH:TZM or a signed integer (of minutes) that represents the time zone offset, and is assumed to be daylight-saving aware and adjusted."

    Insa nu stiu cum sa ii pasez parametru. Adica sa il ajustez in functie de DST.
  •  03-05-2012, 9:05 PM 9151 in reply to 9150

    Re: timezone offset and dst

    Citesc si eu si mai discutam maine.
    Nu poti "actiona" la nivelul aplicatiei - adica nu poti afisa ora corecta folosind cod de .NET, de exemplu?
  •  03-05-2012, 9:27 PM 9152 in reply to 9151

    Re: timezone offset and dst

    Din pacate, in aceasta situatie nu.
    Cerinte sunt ca totul sa fie in sql server.

    Cred ca e asa : Serverul are un timezone pe care il obtin "select datepart(tz,sysdatetimeoffset())". Timezone-ul dat ca parametru sa zicem ca este +2:00 si pentru el se aplica DST ( de observat ca nu pentru toata tarile se aplica DST ). Daca pentru timezone se aplica DST si DST este activ atunci cred ca timezone-ul trebuie sa fie +3:00. Dupa aceea se face switchoffset(getdate() /*asta fiind getdate() de pe server*/, [TZ dat ca parametru peste care este aplicat sau nu DST] - [TZ serverului]) si am obtinut data pentru timezone-ul oferit ca parametru.

    Cam asta am inteles eu :). Intrebarea este daca este corect ceea ce am descris mai sus, si cum stiu si eu toate timezone-urile la care se aplica sau nu DST.
    Nu m-ar deranja sa le harcodez intr-o tabela sau ceva, dar de unde le iau ?

    Dar mai discutam maine.

    Mersi,
  •  03-06-2012, 3:31 PM 9154 in reply to 9152

    Re: timezone offset and dst

    Incearca sa faci un tabel / mai multe tabele de setari / lookup pornind de aici:
    http://www.timeanddate.com/library/abbreviations/timezones/
    Pentru fiecare server poti sa iei datele privind time zone-ul aferent si sa le folosesti ulterior, tinand seama si de datele pe care le calculezi cu functia din articolul lui Tim Cullen.
  •  03-06-2012, 3:31 PM 9155 in reply to 9154

    Re: timezone offset and dst

    Si te rog spune-mi la ce solutie ai ajuns in final. E o problema interesanta :)
  •  03-06-2012, 3:51 PM 9156 in reply to 9152

    Re: timezone offset and dst

    Din cate am observat DST se activeaza si se dezactiveaza in mod diferit pe diferite regiuni. de ex : in USA DST se activeaza pe 11 martie, iar in RO DST se activeaza pe 25 martie.

    Am incercat sa gasesc o tabela cu toate timezone-urile care sa contina si daca DST se aplica, cand se activeaza si cand se dezactiveaza dar nu am reusit.

    Aveti idee cum as putea sa obtin o astfel de informatie ?
  •  03-06-2012, 4:05 PM 9157 in reply to 9156

    Re: timezone offset and dst

    Timezone-urile pe care le cunoaște Windows sunt în registry, la HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.
    Apare acolo și data la care se face trecerea la Daylight Saving Time, în format binar, documentat la:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx

    Răzvan
  •  03-06-2012, 4:06 PM 9158 in reply to 9156

    Re: timezone offset and dst

    Pe stackoverflow este o discuţie pe tema TZ / DST aici:
    http://stackoverflow.com/questions/2532729/daylight-saving-time-and-timezone-best-practices

    O "bază de date" (Olson database / Tz_database) poate fi găsită aici:
    http://www.iana.org/time-zones
  •  03-06-2012, 6:17 PM 9159 in reply to 9158

    Re: timezone offset and dst

    am aruncat o privire pe acea baza de date, dar cum as putea sa o translatez intr-o baza de date sql ? Exista un tool sau ceva ?
  •  03-06-2012, 8:30 PM 9160 in reply to 9159

    Re: timezone offset and dst

    Poate te ajută următorul articol publicat de către  SQL Programmability & API Development Team:
    Using time zone data in SQL Server 2008

    Autorul a folosit o bibliotecă .Net (TZ4Net Library) pentru a citi datele din "baza de date Olson". Ulterior, aceste date sunt scrise în două fişiere *.txt (separator \t) care pot fi importate uşor în SQL Server folosind SSMS > Import data ... sau SSIS. Nu am testat soluţia.
  •  03-06-2012, 8:51 PM 9161 in reply to 9160

    Re: timezone offset and dst

    Yep. Asta rezolva cam totul :).

    In concluzie, se incarca baza aceea de date in sql server, dupa care se foloseste functia switchoffset(datetimeoffset, timezone).
    Atunci cand se da timezone-ul ca parametru, se adauga +1 daca dst este activ, atlfel nu.

    In cazul in care se doreste convertirea unei coloane de tip datetime la datetimeoffset, mergand pe ideea ca au fost introduse de pe serverul pe care se face si convertirea adica timezone-ul dupa care sa facut getdate() a fost intotdeauna acelasi, se poate folosi functia TODATETIMEOFFSET(datetime,offset).

    Pentru a obtine offsetul serverului curent se foloseste datepart(tz,SYSDATETIMEOFFSET()).

    Mentionez ca toate acestea sunt doar pentru sqlserver 2008 si peste.
    Mersi pentru ajutor si sper sa ajute si pe altcineva acest thread.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems