31-DEC-95
není řetězec ani 20-JUN-94
. Jsou to čísla a na konci jsou přidány nějaké věci navíc. Mělo by to být '31-DEC-95'
nebo '20-JUN-94'
- všimněte si jednoduché uvozovky '
. To vám umožní provést porovnání řetězců.
Neprovádíte však porovnávání řetězců; provádíte porovnání dat . Měli byste přeměnit svůj řetězec na datum. Buď pomocí vestavěného TO_DATE()
funkce nebo datový literál.
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Tato metoda má pár zbytečných úskalí
- Jak a_horse_with_no_name poznamenal v komentářích,
DEC
, nemusí nutně znamenat prosinec. Záleží na vašemNLS_DATE_LANGUAGE
aNLS_DATE_FORMAT
nastavení. Chcete-li zajistit, že vaše srovnání s prací v jakémkoli národním prostředí, můžete použít model formátu data a časuMM
místo toho - Rok '95 je nepřesný. Víte, že máte na mysli rok 1995, ale co kdyby to byl rok 50, je to rok 1950 nebo 2050? Vždy je lepší být explicitní
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Datové literály
Datumový literál je součástí standardu ANSI, což znamená, že nemusíte používat specifickou funkci Oracle. Při použití doslovného musíte zadejte datum ve formátu YYYY-MM-DD
a nemůžete zahrnout časový prvek.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Pamatujte, že datový typ Oracle obsahuje prvek času, takže datum bez časové části je ekvivalentní 1995-12-31 00:00:00
.
Pokud chcete zahrnout časovou část, budete muset použít literál časového razítka, který má formát YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Další informace
NLS_DATE_LANGUAGE
je odvozeno z NLS_LANGUAGE
a NLS_DATE_FORMAT
je odvozeno z NLS_TERRITORY
. Ty se nastavují při prvním vytvoření databáze, ale lze je změnit změnou souboru s inicializačními parametry – pouze pokud je to skutečně nutné – nebo na úrovni relace pomocí ALTER SESSION
syntax. Například:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
To znamená:
DD
číselný den v měsíci, 1 – 31MM
číselný měsíc v roce, 01 - 12 ( leden je 01 )YYYY
4místný rok – podle mého názoru je to vždy lepší než dvoumístný rokYY
protože nedochází k záměně s tím, které století máte na mysli.HH24
hodina dne, 0–23MI
minuta v hodině, 0–59SS
sekundu minuty, 0–59
Aktuální nastavení jazyka a data můžete zjistit dotazem V$NLS_PARAMETERSs
a celý rozsah platných hodnot dotazem V$NLS_VALID_VALUES
.
Další čtení
- Formátování modelů
Mimochodem, pokud chcete count(*)
musíte seskupit podle employee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Tím získáte počet za employee_id
.