Zhavlajujem na odgovorima
Fora s pitalicom je u tome da veliki broj ljudi ovo ne zna da izvede, u najmanju ruku covek bar mora da se zamisli pre nego sto odgovori. Sva tri resenja stigli su od kolega koji su u najmanju ruku veoma daleeeko izand proseka. I sva tri resenja su veoma razlicita. Ako dakle medju expertima ne nalazimo resenje 'iz topa' koje je ocigledno i opste poznato, ima smisla zakljucti da ni prosecan znalac SQL-a nema jednostavan odgovor na ovo pitanje. Ni ja nisam znao odgovor kad mi je zatrebalo, i bogami sam se pomucio da ga nadjem (citaj - Google je radio celo poslepodne)
Da podsetim, svrha mozgalica nije da se nadje resenje 'za svaki dan', nego da nas natera da mozgamo.
Pogledajmo sat imamo do sada od resenja:
Prvo, dva ORACLE resenja, veoma razlicita, iako oba daju iste rezultate:
Misko:
Code:
SELECT TO_DATE(TO_CHAR(SYSDATE,'DD')||TO_CHAR(SYSDATE,'MON')||TO_CHAR(SYSDATE,'RR'),'DDMONRR') "Datum" FROM dual;
djoka_1:
Code:
SQL> select sysdate,
2 trunc(sysdate)
3 from dual
4 /
Pretpostavicu da drugo resenje, sa trunc(sysdate) vraca rezultat koji je datumskog tipa a ne varchar ili slicno. Varchar uslovima zadatka nije dozvoljen.
Za MS SQL dobili smo resenje koje ispisuje naizgled tacan rezultat, ali ne odgovara uslovima zadatka. Zadatkom se trazi da resenje bude u Datetime fomatu, varchar nije dozvoljen. Jos jedan CAST oko Zoranovog resenja dao bi ono sto se trazi:
Code:
SELECT GetDAte() AS [input]
, CONVERT(VARCHAR(10), GETDATE(), 104) AS SamoDatum_varchar ---- by Zoran Eremija
, CAST(CONVERT(VARCHAR(10), GETDATE(), 104) AS datetime) AS Samodatum_DateTime
input SamoDatum_varchar Samodatum_DateTime
----------------------- ----------------- -----------------------
2010-04-12 14:16:06.670 12.04.2010 2010-12-04 00:00:00.000
(1 row(s) affected)
Potencijalni problem sa ovom vrstom konverzije jeste sto smo dali format 104. Na mojoj masini datum se prikazuje 2010-04-12 (GGGG-MM-DD), konverzija bez CAST dala je 12.04.2010 (DD>MM.GGGG) sto bi prosecnog amerikanca zbunilo, iako bi ga englez shvatio pravilno. Medjutim, i konverzija nazad u datetime sa CAST daje 2010-12-04 sto bi zbunilo i amerikanca i evropljanina jer format GGGG-DD-MM nije bas tako cest. I bilo koji drugi format bio bi podjednako zbunjujuci, nije 104 nesto posebno kriv.
Od prvog resenja za ORACLE, moze se napraviti slicno, za MS SQL:
Code:
SELECT
Getdate() AS [input]
, CAST(
(
STR( YEAR( Getdate() ) ) + '/' +
STR( MONTH( Getdate() ) ) + '/' +
STR( DAY( Getdate() ) )
)
AS DATETIME
) AS SamDatum
input SamoDatum
----------------------- -----------------------
2010-04-12 14:47:08.897 2010-04-12 00:00:00.000
Namerno je redosled YEAR,MONTH,DAY, time ce bar sam MS SQL server da bude najmanje zbunjen. Ovo resenje nije promenilo nacin prikaza datuma, barem na mojoj lokaciji, ali ne mogu da tvrdim da ce to da bude tako i u Srbiji. Neka neko proba, pa javite sta se dobija.
Najveca muka sa konverzijama je - sta ce na kraju da se 'vidi', tio niko ne moze da kaze sa sigurnoscu. Uzsov zadaka je da se vrati datetime podatak, jer se ocekuje da ce tada ulaz i rezultat biti prikazani na isti nacin, barem u nekim slucajevima, ili barem na najmanje zbunjujuci nacin.
Postoje i resenja gde se ne radi nikakva konverzija. Poznata imena iz SQL sveta tvrde da resenja bez konverzija jos i rade za red velicine brze. Za velike setove podataka ovo moze biti znacajno. Ima i jos resenja sa konverzijom, koja su kraca za pisanje.
Ima li daljih predloga? I Access ima dateTime tip podatka, kako je tamo?