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_objednavkaregistracedni
2460329.52459959.5370.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;
jmenoregistracedni
Eva Novotná2023-01-15717
Jakub Dvořák2023-02-03698
Tereza Svobodová2023-04-21621

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.

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ší:

nazevvydanodni_v_prodeji
Knight's Oath2025-11-1448
Goal Rush2025-09-2697
Turbo Karts2025-06-05210
………

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:

iddatumdni_do_vanoc
262025-11-1440
272025-11-2034
282025-11-2826
292025-12-1212
302025-12-222

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

8/10