Počet dní mezi daty
Kolik dní uplynulo mezi dvěma daty? Odečíst je od sebe nejde, a dokonce to ani neskončí chybou:
SELECT '2024-01-20' - '2023-01-15' AS dni;| dni |
|---|
| 1 |
Data jsou texty, a když má SQLite s textem počítat, vezme číslo na jeho začátku a zbytek ignoruje. Tohle je tedy 2024 - 2023, a to je 1. Data se nejdřív musí stát čísly, a to dělá julianday(datum): vrátí počet dní od jednoho dávného dne (24. listopadu 4714 př. n. l., který astronomové počítají jako den 0). Samotné číslo zajímavé není, ale rozdíl dvou takových čísel je počet dní mezi daty:
SELECT julianday('2024-01-20') AS prvni_objednavka,
julianday('2023-01-15') AS registrace,
julianday('2024-01-20') - julianday('2023-01-15') AS dni;| prvni_objednavka | registrace | dni |
|---|---|---|
| 2460329.5 | 2459959.5 | 370.0 |
Eva Novotná zadala svou první objednávku 370 dní po registraci. (Půlka na konci je tam proto, že astronomům začíná den v poledne; v rozdílu se odečte.)
Rozdíl je desetinné číslo, 370.0, protože julianday počítá i s hodinami: julianday('2024-01-20 18:00') je o tři čtvrtě dne víc. Celé číslo z něj udělá CAST(x AS INTEGER). CAST převede hodnotu na jiný typ: INTEGER, REAL nebo TEXT. Při převodu na celé číslo desetinnou část usekne, stejně jako celočíselné dělení: CAST(3.9 AS INTEGER) je 3. Data bez času jsou od sebe vždycky celé dny, takže se nic neztratí. Kolik dní byl každý zákazník u obchodu k Novému roku 2025?
SELECT jmeno, registrace,
CAST(julianday('2025-01-01') - julianday(registrace) AS INTEGER) AS dni
FROM zakaznici
LIMIT 3;| jmeno | registrace | dni |
|---|---|---|
| Eva Novotná | 2023-01-15 | 717 |
| Jakub Dvořák | 2023-02-03 | 698 |
| Tereza Svobodová | 2023-04-21 | 621 |
Místo CAST byste mohli použít ROUND, ale to dá 717.0. A když už jsou dny celé číslo, celočíselné dělení dá celé týdny: 717 / 7 je 102.
Pro NULL vrátí julianday stejně jako jiné funkce NULL, takže hra, která ještě nevyšla, žádný počet dní od vydání nemá. A julianday('now') je právě teď, takže julianday('now') - julianday(registrace) je, jak dlouho je zákazník u obchodu dnes, a to číslo každý den roste.
Typická chyba: data v opačném pořadí. julianday(registrace) - julianday('2025-01-01') dá u Evy Novotné -717.0. Odečítejte vždycky dřívější datum od pozdějšího.
Jak psát:
Pokyny
Jak dlouho už byla každá hra v prodeji 1. ledna 2026 ('2026-01-01')? Ukažte název, datum vydání a počet dní jako dni_v_prodeji – celé číslo (48, ne 48.0). Hry seřaďte podle data vydání od nejnovější:
| nazev | vydano | dni_v_prodeji |
|---|---|---|
| Knight's Oath | 2025-11-14 | 48 |
| Goal Rush | 2025-09-26 | 97 |
| Turbo Karts | 2025-06-05 | 210 |
| … | … | … |
Pod tím ukažte, kolik dní před Štědrým dnem 2025 ('2025-12-24') byly zadány objednávky z listopadu a prosince 2025: ID, datum a dni_do_vanoc jako celé číslo. Objednávky seřaďte podle data:
| id | datum | dni_do_vanoc |
|---|---|---|
| 26 | 2025-11-14 | 40 |
| 27 | 2025-11-20 | 34 |
| 28 | 2025-11-28 | 26 |
| 29 | 2025-12-12 | 12 |
| 30 | 2025-12-22 | 2 |
Začněte programovat zdarma
8/10