No jo. SQLite pracuje s datovymi typmi dost zvlastne. Ma aj jeden "misticky" datovy typ nazvany NUMERIC. V SQLite okrem celociselnych typov a textov nic ine nepouzivam takze nemal som v tom az taky velky prehlad. Ale preletel som si popis datovych typov a v rychlosti som to pochopil tak ze datovy typ NUMERIC (a vlastne nie len on, ale asi vsetky) mozu vyuzit hociaku uloznu triedu (INTEGER, REAL, TEXT i BLOB) s tym ze do datoveho typu NUMERIC sa prevadzaju stlpce z deklaraciou BOOLEAN,
DATE, DATETIME, DECIMAL(x,y) a vlaste vsetky ktore SQLite nepozna a SQLite si sama vyberie az pocas inzertu alebo updatu do akej uloznej datovej triedy to bude ukladat a zacina od tych najusporejsich a ked jej to neide tak stale postupuje vyssie.
Cizne najprv sa data snazi ukladat ako Integer, ked to neide tak potom ako real a ked ani to neide tak potom TEXT a ten si mozme povedat ze znesie vsetko. No a to sa stalo aj tebe. Mysteriom tohto pristupu je to ze aj ked je stlpec definovany ako nejaky typ, ci uz INTEGER, REAL, NUMERIC, alebo TEXT tak aj tak v podstate na kazdom riadku tabulky moze byt inym datovym typom. Teraz som si to vyskusal a ziram.
Skus si nieco take:
CREATE TABLE t1(nu NUMERIC);
INSERT INTO t1 VALUES(500);
INSERT INTO t1 VALUES(500.58);
INSERT INTO t1 VALUES(x'A6B3D0');
INSERT INTO t1 VALUES('asfsd fadsf');
SELECT typeof(nu) FROM t1;
Cize ja osobne v SQLite ked pracujem z datumami tak vzdy pracujem s unixackim vyjadrenim casu coz je pocet sekund od 1970-01-01 00:00:00 UTC (delphi na to ma tiez funkcie DateTimeToUnix a naopak). Pokial nepotrebujem milisekundy tak vzdy preferujem tento cas pretoze sa jedna o najuspornejsi datovy typ a to celocislny integer s ktorym sa pracuje najrychlejsie a najuspornejsie. Problem je len to ze je to pracnejsie pretoze to vobec nie je human readable udaj a stale s nim musis narabat pomocou funkcii
https://www.sqlite.org/lang_datefunc.html Cize furt musim pouzivat napr. nieco take:
SELECT datetime(MyUnixTimeField, 'unixepoch');
a podobne
Na druhu stranu zase krasne a jednoznacne pracuju operatory <, >, =. Pretoze je to klasicka celocislna aritmetika, cize ja som v tomto pripade nikdy nemal problem. No praca s datumami v SQLite nie je celkom to prave orechove.
Ak mas datum v tabulke ulozeny vo formate '01.01.2001' tak si v prdeli, pretoze na to nemozes pouzit operatory < a >. Pretoze ak ho budes porovnavat s datumom '30.01.1000' tak ten s letopoctom tisic bude vacsi ako ten z 2001 pretoze 30ka je vacsia ako 01. Ak by si mal datumy striktne ulozene vo formate yyyy-mm-dd tak ti to porovnanvanie bude este dobre fungovat. Cize bud pouzi pocet sekund cize unix time, alebo textovy format yyyy-mm-dd ale potom si musis byt vedomi toho ze je to len text a vzdy to len textom ostane a platia pre to aj vsetky ostatne pravidla a format musis dodrzat do bodky...
A este pozor aj na takuto chybu 2016-5-15. Namiesto 5ky musi byt vzdy 05. Pocet znakov musi byt vzdy 10.