sql >> Databáze >  >> RDS >> Oracle

Porovnání dat v Oracle SQL

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šem NLS_DATE_LANGUAGE a NLS_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 času MM 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 – 31
  • MM čí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ý rok YY protože nedochází k záměně s tím, které století máte na mysli.
  • HH24 hodina dne, 0–23
  • MI minuta v hodině, 0–59
  • SS 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 .



  1. Získejte poslední den v měsíci v PostgreSQL

  2. Jak přidám indexy do tabulek MySQL?

  3. Jak získat sloupec primárního klíče v Oracle?

  4. Varování Počet přečtených řádků / Skutečné přečtení řádků v Průzkumníku plánů