Autor Téma: SQLite - zápis dátumu v Select  (Přečteno 4089 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
SQLite - zápis dátumu v Select
« kdy: 13-06-2016, 16:07:15 »
Príklad som nenašiel a mne vychádza, že to mám písať v tvare '01.01.2015' alebo '2015-01-01'
Ale problém je aj v tom, že v DB mám dátumy zobrazené dvoma spôsobmi:
1) 01.01.2015
2) 2015-01-01
a to sú, aspoň podľa mojich pokusov, dve rôzne hodnoty! Neviem síce prečo mám dva druhy zápisu, ale robí to problém. Predsa budem používať DateToStr(MyDate).
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #1 kdy: 13-06-2016, 17:02:39 »
No DateToStr momentalne nie je zrovna najlepsia volba. Vysledny textovy retazec je totiz zavisly od jazykovych nastaveni windowsu. Takze sa ti ani moc necudujem ze mas v db datumy raz tak a raz inac. Vseobecne pouzivany format datumu v SQL je "yyyy-mm-dd [hh:nn[:ss[:mmm]]]" (hranate zatvorky oznacuju nepovinne zadanie).

Zasadne pouzivam tieto dva prevodove prikazy na zadavanie datumov do sql.

Kód: [Vybrat]
FormatDateTime('yyyy-mm-dd',MyDate);
FormatDateTime('yyyy-mm-dd hh:nn:ss',MyDate);

Najidealnejsie bude ked si vytvoris na to dve funkcie nieco ako DateToSQLDateString a DateTimeToSQLDateString, nech nemusis ten format stale pracne vypisovat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #2 kdy: 13-06-2016, 18:31:35 »
V skutočnosti použijem EncodeDate. To bol iba príklad, že použijem nejakú funkciu na vrátenie dátumu, ktorého formát je závislý na nastavení OS. Ako to aj spomínaš.
Mňa viac trápi, že v jednej tabuľke mám dva druhy zobrazenia dátumov a s tými sa pracuje. Neviem ako som k tomu došiel. Doteraz som vždy vychádzal z toho, že nezáleží ako sú údaje zobrazené ale ako sú uložené. A dátum je vždy číslo.
Lenže tu mi vychádza, že to tak nie je. To je pre mňa menší šok.
Predsa je nezmysel aby som písal
Kód: [Vybrat]
where MyDate = '01.01.2015' or Mydate = '2015-01-01'
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline mjseven

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 5
    • Verze Delphi: D7, D2006, XE2, Lazarus
Re:SQLite - zápis dátumu v Select
« Odpověď #3 kdy: 13-06-2016, 18:42:22 »
V SQLite jsou datumy malá alchymie  :(
Pro práci v selectech mi hodně pomohla funkce strftime https://www.sqlite.org/lang_datefunc.html
přímo v SQL dotazu.
Tuším, že číselně ukládá jen TimeStamp a ostatní datumové jako text.




Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #4 kdy: 13-06-2016, 18:44:40 »
Citace
Tuším, že číselně ukládá jen TimeStamp a ostatní datumové jako text.
To správanie tomu zodpovedá. Na tie funkcie som narazil, ale nevenoval som im veľmi pozornosť. Ale prečo mi to uložilo v rôznych formátoch (FireDACSQLite)
« Poslední změna: 13-06-2016, 18:53:43 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite - zápis dátumu v Select
« Odpověď #5 kdy: 13-06-2016, 20:54:05 »
Excellent
Rated 1 time
Kód: [Vybrat]
where MyDate = '01.01.2015' or Mydate = '2015-01-01'
No hlavne: ty nemas u zadne DB co v selectu zapisovat datum a cas v nejakem konkretnim formatu. Konkretni format datumu je otazka prezentacni vrstvy na rozhrani stroj-clovek a preferenci UI.

Na to jsou parametrizovane dotazy, kde to do parametru predas hodnotu jako Delphi typ TDateTime (nebo jak se to jmenuje) a zbytek nechas na wrapperu. A ten by mel vedet, jake jsou moznosti Sqlite pracovat s datumem a casem viz

http://www.sqlite.org/datatype3.html#section_2_2
http://www.sqlite.org/lang_datefunc.html

a vhodne SQL prikaz sestavit.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #6 kdy: 13-06-2016, 21:23:29 »
Ten SQLite ma privedie do hrobu. Na čo som sa to dal nahovoriť :'(
Citace
Na to jsou parametrizovane dotazy, kde to do parametru predas hodnotu jako Delphi typ TDateTime
Robím to zásadne a iba/len cez parametre. Napriek tomu sa mi tam objavil v dvoch formátoch. A formát dd.mm.yyyy neuvádzajú. Neviem či to nie je zmena platná pre ver. 3.13.0
Teraz konkrétne
Kód: [Vybrat]
SELECT DISTINCT CLUB_MEMBER.DATEFROM, CLUB_MEMBER.DATETO
FROM CLUB_MEMBER
WHERE
  ('10.04.2016' BETWEEN CLUB_MEMBER.DATEFROM AND CLUB_MEMBER.DATETO) or
  (CLUB_MEMBER.DATEFROM < '10.04.2016' and CLUB_MEMBER.DATETO is null)
mi vráti

01.01.2015
01.01.2015 30.04.2016  // Majú byť dva
01.05.2016                     // nejakých 110

V prílohe je časť tabuľky. Záznamov s DateTo is null je tam 111


Zabudol som. Teraz tie príkazy robím v query builder-y. Preto tam nemám parametre. Ale ani parametre nepomohli.
« Poslední změna: 13-06-2016, 21:35:02 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #7 kdy: 13-06-2016, 21:36:18 »
ja sa zacinam obavat ze tie tvoje stlpce DATEFROM a DATETO su v podstate textove fieldy a co do nich nasipes to tam mas format neformat a komparacaie ktore nad nimi robis v SQL nie su ciselne, ale uz textove. Ako mas definovau tu tabulku vlastne?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #8 kdy: 13-06-2016, 21:50:38 »
Citace
Ako mas definovau tu tabulku vlastne?
Dobre :)
Kód: [Vybrat]
CREATE TABLE CLUB_MEMBER
 (IDCLUB_MEMBER INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
FKCLUBS INTEGER NOT NULL REFERENCES CLUBS (IDCLUBS),
FKMEMBERS INTEGER REFERENCES MEMBERS (IDMEMBERS) NOT NULL,
DATEFROM DATE NOT NULL,
DATETO DATE);
A dátumy sa skutočne ukladajú ako texty.
Citace
2.2. Date and Time DatatypeSQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:
  • TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
  • REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
  • INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
Applications can chose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #9 kdy: 13-06-2016, 21:54:04 »
No, teraz som pokusne uložil dátum a je vo formáte 2016-10-14. Idem všetko upraviť do tohto formátu a uvidím čo sa bude diať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #10 kdy: 13-06-2016, 22:13:43 »
Dokonca mi po oprave vyberie iba dva záznamy. A všetko čo sa týka dátumov som si poriadne skontroloval.
V Accesse by som to mal už 3x hotové >:(
A to ešte nepodporuje Right a Outer Join ! Osobne mi to nevadí ale query builder mi v niektorých prípadoch pretláča Right namiesto Left a potom ryčí ::) . Samé radosti 8)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #11 kdy: 13-06-2016, 22:30:11 »
Už som skoro vypol NB, ale ešte som to skúsil. A už mi to ide. Mám taký dojem, že ak niečo s SQLite robím, tak môže/musí byť otvorená len raz - v jedinom programe. Ináč to bude robiť bludy. A to som nemal splnené. Mal som ju otvorenú v SQLiteStudio a FlySpeed SQL Query.
A tiež nie je možné použiť jeden parameter na dvoch miestach. Musia byť dva. Či sa mýlim? To neznáša ani Access. FB s tým problém nemá.
Snáď to zajtra dokončím.
« Poslední změna: 13-06-2016, 22:33:18 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #12 kdy: 13-06-2016, 23:45:01 »
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:
Kód: [Vybrat]
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:

Kód: [Vybrat]
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.
« Poslední změna: 13-06-2016, 23:49:57 od Daniel_Andrascik »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #13 kdy: 14-06-2016, 07:43:02 »
Vďaka za vysvetlenie. Keď som sa dočítal, že to je text, tak ma napadli aj tie súvislosti. Aj to, že formát 01.01.2016 je volovina.
Ako prinútim FireDAC aby dátum uložil v unix formáte? To bolo prvé čo ma napadlo. Číslo je číslo. Radšej používať tie funkcie, než mať bordel. Akurát to v náhľade neprečítam.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #14 kdy: 14-06-2016, 08:14:12 »
A najlepšie by to bolo bez času. Len čistý dátum.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 260
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:SQLite - zápis dátumu v Select
« Odpověď #15 kdy: 14-06-2016, 08:59:15 »
troska odveci - ale preco is opustil firebird?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #16 kdy: 14-06-2016, 09:00:41 »
Ja som ho neopustil. Ale na takú mini aplikáciu je to zbytočne veľký moloch.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #17 kdy: 14-06-2016, 10:02:32 »
Ako prinútim FireDAC aby dátum uložil v unix formáte? To bolo prvé čo ma napadlo. Číslo je číslo. Radšej používať tie funkcie, než mať bordel. Akurát to v náhľade neprečítam.

Tak proste polopatistikcy. Ad jedna nadefinujes si stlpce DATEFROM a DATETO ako integer. Ale ako uz bolo napisane to ti v sqlite nzabrani aby si do nich ulozil text, je to divne a ale je to specifikum sqlite. Ale na druhu stranu aspon firedac bude informovany o tom ze dany stlpec je celociselne cislo a mozno aspon on bude protestovat. No a ad dva potom proste inzerty budes robit cez parametre ako integery cize nejako takto:

Kód: [Vybrat]
  FCommand.Params.ParamByName('DATETO').AsInteger := DateTimeToUnix(Now);

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #18 kdy: 14-06-2016, 10:09:54 »
A najlepšie by to bolo bez času. Len čistý dátum.

tak unix time je proste pocet sekund od 1970, to nie je jak TDateTime ktoreho celociselna cast je pocet dni a desatinna cast vyjadruje cas zo dna. Ak chces mat vzdy ulozeny presne zaciatok dna tak bud pouzijes ofiko funkciu StartOfTheDay(Now) alebo len prasacky odstrihnes desatinu cast z TDateTime cize Trunc(Now).

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite - zápis dátumu v Select
« Odpověď #19 kdy: 14-06-2016, 11:01:53 »
Ale ako uz bolo napisane to ti v sqlite nzabrani aby si do nich ulozil text, je to divne a ale je to specifikum sqlite.
Jestli ti to pamatuju, tak kdyz jsem s Sqlite kdysi zacinal, tak mel jen INT (na klice) a TEXT (ASCIIZ) na vsechna ostatni data.
Hwaci pak zacal od tohoto pruzracneho konceptu ustupovat tlaku DB verejnosti a zacal z toho delat kocko-psa. Z meho pohledu bohuzel.



Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #20 kdy: 14-06-2016, 11:27:58 »
No pre mna je najviac zarazajuce ze bez ohladu na to co si clovek nadefinuje pri deklaracii stlpca, tak to ako sa dany udaj fyzicky ulozi sa vyhodnocuje pri kazdom jednom inserte alebo update osobitne. A nasledne ked si clovek selektne typeof(stlpec), tak kludne vidi ze v kazdom riadku toho isteho stlpca ma iny datovy typ  :o :o :o. To naozaj ako hovoris mali nechat len INT a TEXT a aspon mali osetrit aby sa do INTu nedal narvat text. SQLite ma byt naozaj lite nastroj na pracu s datami, kludne by to z mojho pohladu bol akceptovatelny koncept. Ale ulozit Mor Ho od Sama Chalupku do fieldu typu INTEGER bez akychkolvek protestov mi pride naozaj trosku pritiahnute za vlasy.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite - zápis dátumu v Select
« Odpověď #21 kdy: 14-06-2016, 12:36:02 »
No pre mna je najviac zarazajuce ze bez ohladu na to co si clovek nadefinuje pri deklaracii stlpca, tak to ako sa dany udaj fyzicky ulozi sa vyhodnocuje pri kazdom jednom inserte alebo update osobitne. A nasledne ked si clovek selektne typeof(stlpec), tak kludne vidi ze v kazdom riadku toho isteho stlpca ma iny datovy typ  :o :o :o. To naozaj ako hovoris mali nechat len INT a TEXT a aspon mali osetrit aby sa do INTu nedal narvat text. SQLite ma byt naozaj lite nastroj na pracu s datami, kludne by to z mojho pohladu bol akceptovatelny koncept. Ale ulozit Mor Ho od Sama Chalupku do fieldu typu INTEGER bez akychkolvek protestov mi pride naozaj trosku pritiahnute za vlasy.
Co na to rict? Snad jen, ze je treba precist dokumentaci, kterou ma Hwaci IMHO perfektni (a pripomenout, ze Sqlite vznikla k TCL a dostala za to tusim v roce 2005 cenu https://developers.google.com/open-source/osa/#2006-google-oreilly-open-source-award-winners):

Most SQL database engines use static typing. A datatype is associated with each column in a table and only values of that particular datatype are allowed to be stored in that column. SQLite relaxes this restriction by using manifest typing. In manifest typing, the datatype is a property of the value itself, not of the column in which the value is stored. SQLite thus allows the user to store any value of any datatype into any column regardless of the declared type of that column. (There are some exceptions to this rule: An INTEGER PRIMARY KEY column may only store integers. And SQLite attempts to coerce values into the declared datatype of the column when it can.)

As far as we can tell, the SQL language specification allows the use of manifest typing. Nevertheless, most other SQL database engines are statically typed and so some people feel that the use of manifest typing is a bug in SQLite. But the authors of SQLite feel very strongly that this is a feature. The use of manifest typing in SQLite is a deliberate design decision which has proven in practice to make SQLite more reliable and easier to use, especially when used in combination with dynamically typed programming languages such as Tcl and Python.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 416
  • Karma: 15
    • Verze Delphi: D2007, XE3
Re:SQLite - zápis dátumu v Select
« Odpověď #22 kdy: 14-06-2016, 12:45:54 »
Nuz, co k tomu dodat, je to proste nasa oblubena SQLite ;). Vzdy sa najdu aplikacie pre ktore bude vhodna a pouzitelna, sam ju stale masivne pouzivam na logovania a ukladanie trendov a merani. Len treba mat na zreteli nejake zakladne zasady pri jej pouzivani.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 256
  • Karma: 6
    • Verze Delphi: 10.2
Re:SQLite - zápis dátumu v Select
« Odpověď #23 kdy: 14-06-2016, 21:08:14 »
Ja som ho neopustil. Ale na takú mini aplikáciu je to zbytočne veľký moloch.
Radši bych k aplikaci nahrál Firebird embedded, než se pral kvůli troše ušetřeného místa s další databázi a řešil takováhle překvapení...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #24 kdy: 14-06-2016, 22:02:22 »
S tým už teraz celkom súhlasím ;)  Ale bol som aj zvedavý čo je to za čudo, keď ju tak odporúčajú :o  A ono to čudo je ;D
Teraz budem rozmýšľať či to nemám zmeniť! Access už z princípu vynechávam.
A je otázne čo prinesie budúcnosť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 239
  • Karma: 10
    • Verze Delphi: 2009, Tokyo
Re:SQLite - zápis dátumu v Select
« Odpověď #25 kdy: 22-06-2017, 22:57:41 »
Kazde DMBS ma sve vyuziti jinde. SQLite je napr. perfektni pro lokalni pouziti. Nicmene, Firebird bych nechal zemrit tak jak vznikl, to ze se ho nekdo snazit zastat je nejspis z archaickych duvodu. Ale k dotazu, to si nikdo nevsiml ze OP pouziva FireDAC? Ten je schopny konvertovat datove typy podle typu fyzickeho pripojeni. Staci pouzit parametry, tj. definovat dotaz jako:

Kód: MySQL [Vybrat]
  1. SELECT DISTINCT CLUB_MEMBER.DATEFROM, CLUB_MEMBER.DATETO
  2.   FROM CLUB_MEMBER
  3.   (:SomeDate BETWEEN CLUB_MEMBER.DATEFROM AND CLUB_MEMBER.DATETO) or
  4.   (CLUB_MEMBER.DATEFROM < :SomeDate and CLUB_MEMBER.DATETO is null)

A v kodu pouzit:

Kód: Delphi [Vybrat]
  1. FDQuery.ParamByName('SomeDate').AsDate := MyDate;

Pokud by bylo treba definovat konstantni hodnotu, staci (zase, pro vsechny podporovane DBMS) pouzit makro {d} ve formatu yyyy-mm-dd, napr. pro datum 21.1.2016:

Kód: MySQL [Vybrat]
  1. SELECT DISTINCT CLUB_MEMBER.DATEFROM, CLUB_MEMBER.DATETO
  2.   FROM CLUB_MEMBER
  3.   ({d 2016-01-21} BETWEEN CLUB_MEMBER.DATEFROM AND CLUB_MEMBER.DATETO) or
  4.   (CLUB_MEMBER.DATEFROM < {d 2016-01-21} and CLUB_MEMBER.DATETO is null)

Nebo trebas makro CONVERT, ale tohle je mnohem lepe citelnejsi.

Sorry za dalsi flame ;D
« Poslední změna: 22-06-2017, 23:06:08 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 239
  • Karma: 10
    • Verze Delphi: 2009, Tokyo
Re:SQLite - zápis dátumu v Select
« Odpověď #26 kdy: 22-06-2017, 23:32:13 »
Samozrejme ne jen FireDAC je schopen konvertovat datove typy za pouziti parametru. Nicmene ne jen kvuli tomu ty parametry dotazu existuji, parametry dotazu existuji take kvuli SQL injection a urychleni prenosu dat mezi klientem a serverem v pripade predpripraveneho SQL dotazu (dotaz se pripravi na strane serveru a pak se posilaji jen hodnoty parametru v pripade opakovaneho vyuziti dotazu). Neni treba hned nadavat na konkretni typ DBMS ;)
« Poslední změna: 22-06-2017, 23:37:53 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite - zápis dátumu v Select
« Odpověď #27 kdy: 23-06-2017, 09:43:29 »
Firebird bych nechal zemrit tak jak vznikl, to ze se ho nekdo snazit zastat je nejspis z archaickych duvodu.
Ze vsech moznejch i nemoznejch RDBMS se kterymi jsem musel delat bych FB preferoval pred parodii MySQL (s tou se nedalo delat skoro vubec, pokud clovek potrebovalref. integridu a evoluci schematu) a pred "sblitkem" MSSQL (s tou dokazu delat jen prostrednictvim EF)

Citace
Ale k dotazu, to si nikdo nevsiml ze OP pouziva FireDAC? Ten je schopny konvertovat datove typy podle typu fyzickeho pripojeni. Staci pouzit parametry, tj. definovat dotaz jako:
A to sis nevsiml, ze v odpovedi #6 dostal radu, ze ma pouzit parametry, ze to po roce vytahujes znovu na svetlo?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2879
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:SQLite - zápis dátumu v Select
« Odpověď #28 kdy: 23-06-2017, 10:52:45 »
Hlavne, že som dal na radu vandrovnika a použil FB ;) 
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 239
  • Karma: 10
    • Verze Delphi: 2009, Tokyo
Re:SQLite - zápis dátumu v Select
« Odpověď #29 kdy: 23-06-2017, 17:36:04 »
Firebird bych nechal zemrit tak jak vznikl, to ze se ho nekdo snazit zastat je nejspis z archaickych duvodu.
Ze vsech moznejch i nemoznejch RDBMS se kterymi jsem musel delat bych FB preferoval pred parodii MySQL (s tou se nedalo delat skoro vubec, pokud clovek potrebovalref. integridu a evoluci schematu) a pred "sblitkem" MSSQL (s tou dokazu delat jen prostrednictvim EF)

Citace
Ale k dotazu, to si nikdo nevsiml ze OP pouziva FireDAC? Ten je schopny konvertovat datove typy podle typu fyzickeho pripojeni. Staci pouzit parametry, tj. definovat dotaz jako:
A to sis nevsiml, ze v odpovedi #6 dostal radu, ze ma pouzit parametry, ze to po roce vytahujes znovu na svetlo?

Nevsiml, sorry potom :-X

No MySQL je taky nadeleni. Kdybych si mohl vybrat free reseni pro stredne velke skladiste dat, vybral bych si PostgreSQL. Vyvoj se zda byt bran vazne, coz mi u FB nepripada moc slavne (to snad uz Interbase, kde se EMBT tvari ze neco vyrabi).
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):