Datové typy a rozdíly mezi nimi jsou v dokumentaci . Krátká verze je:
- DATE má přesnost až na sekundu bez podpory časového pásma;
- TIMESTAMP má přesnost až na zlomky sekundy (až na devět desetinných míst, ale ovlivňuje to i váš operační systém), stále bez podpory časového pásma;
- TIMESTAMP S TIME ZONE má stejnou přesnost jako TIMESTAMP, ale také podporuje časové pásmo, jak název napovídá;
- TIMESTAMP WITH LOCAL TIME ZONE upravuje uloženou hodnotu do a z místního časového pásma relace vytváření/dotazování.
Možná najdete tento článek také zajímavé.
Kdykoli porovnáváte hodnoty datetime uložené ve vaší databázi, měli byste k porovnání použít hodnoty stejného datového typu. Nechcete převádět každou hodnotu ve sloupci pro porovnání, zvláště pokud je sloupec indexován. Pokud máte sloupec DATE, porovnejte s DATE – neporovnávejte jako řetězec a nespoléhejte na implicitní konverze struny. Když to uděláte:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
spoléháte na to, že váš NLS_DATE_FORMAT je DD-MON-YYYY a váš NLS_DATE_LANGUAGE je angličtina. Pokud někdo jiný spustí stejný dotaz v jiné relaci, jeho nastavení může způsobit selhání dotazu (nebo v některých případech poskytnout nesprávné výsledky, což může být horší). Abyste se vyhnuli jazykovým problémům, je lepší používat spíše čísla měsíců než jména. Pokud máte řetězcovou proměnnou k porovnání, měli byste použít TO_DATE()
převést řetězec na DATE pomocí masky pevného známého formátu – nespoléhejte na NLS. Pokud máte pevnou hodnotu, můžete udělat totéž, nebo můžete použít datový literál
, který je kratší a jednoznačný.
S formátem, který jste použili, zahrnete také všechny řádky, které mají sloupec nastaven na půlnoc 1. ledna 2000, ale ne později v tento den. To může být to, co chcete, ale ujistěte se, že rozumíte BETWEEN
funguje. Pokud skutečně hledáte data v tomto desetiletí, včetně kdykoli 31. prosince 1999, můžete použít:
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
Pro časová razítka můžete buď použít TO_TIMESTAMP()
nebo literál časového razítka:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
Pro časová razítka s časovými pásmy můžete buď použít TO_TIMESTAMP_TZ()
nebo literál časového razítka s názvy region časového pásma:
WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'