DST funkcija

Thursday, 27.09.2012 – mradovan

DST (Daylight Saving Time) je interesantna fora uvedena za vrijeme 1. svj. rata u svrhu bolje usklađenosti dnevnog i radnog svjetla, te naravno ušteda na potrošnji energije za osvjetljavanje.

Koliko god korisno, pomicanje sata unatrag u proljeće te unaprijed na jesen ima i svoje štetne posljedice, a to su anomalije u broju sati u danima pomicanja kazaljke. Tako se dogodi da u prvom slučaju imamo 23 sata, dok u drugom slučaju imamo dan u trajanju od 25 sati.

Pojedini sustavi standardno zapisuju vremena u UTC formatu, a za svrhu prikaza potrebno je to vrijeme konvertirati u lokalno vrijeme. Iako postoji vjerojatno mnogo algoritama i biblioteka za to, ja sam za potrebe obrade podataka na razini Oracle baze podataka napisao funkciju koja ulazno UTC vrijeme vraća kao lokalno vrijeme. Varijabla l_result unutar funkcije ima inicijalnu vrijednost 1, a to se odnosi na +1 vremensku zonu kojoj pripadamo. Ako živimo npr. u Londonu, ta varijabla bi trebala imati inicijalnu vrijednost 0. Datum pomicanja sata nije fiksan, već se radi o posljednjoj nedjelji u 3. i 10. mjesecu u godini.

CREATE OR REPLACE FUNCTION ARCHDB.LOCALTIME(utc_in date) RETURN date
IS
  l_start date;
  l_end date;
  l_result number := 1;
BEGIN
  l_start := to_date('31.03.' || extract (YEAR FROM utc_in), 'dd.mm.yyyy');
  l_end := to_date('31.10.' || extract (YEAR FROM utc_in), 'dd.mm.yyyy');

  SELECT (TRUNC (LAST_DAY  (l_start) + 1, 'iw') - 22/24) INTO l_start FROM DUAL;
  SELECT (TRUNC (LAST_DAY  (l_end) + 1, 'iw') - 21/24) INTO l_end FROM DUAL;

  IF utc_in BETWEEN l_start AND l_end THEN
     RETURN utc_in + (l_result + 1)/24;
  ELSE 
     RETURN utc_in + l_result/24;
  END IF;

EXCEPTION
   WHEN others THEN RETURN NULL;
END LOCALTIME;
  1. 2 Responses to “DST funkcija”

  2. Veoma korisno!
    A jesi li razmisljao o koristenju tipa TIMESTAMP WITH TIME ZONE, odnosno TIMESTAMP WITH LOCAL TIME ZONE ( http://docs.oracle.com/cd/E11882_01/server.112/e17118/sql_elements001.htm#autoId16 ) ?

    By Dejan on Sep 29, 2012

  3. Zahvaljujem na digresiji, dobra preporuka, no u ovom slučaju sam kupio podatke koji su spremljeni u MS SQL bazi od strane posebnog industrijskog softvera koji očitava mjerenja sa raznih mjernih uređaja, i na takve podatke nisam imao nikakav utjecaj.
    Tu bi se doduše dalo igrati sa date funkcijama i njihovim parametrima, ali ovo mi je izgledalo nekako pouzdanije ;).

    By MIhael Radovan on Oct 1, 2012

Post a Comment