Oracle
 sql >> Database >  >> RDS >> Oracle

Confronto delle date in Oracle SQL

31-DEC-95 non è una stringa, né 20-JUN-94 . Sono numeri con alcune cose extra aggiunte alla fine. Dovrebbe essere '31-DEC-95' o '20-JUN-94' - nota la virgoletta singola, ' . Ciò ti consentirà di eseguire un confronto di stringhe.

Tuttavia, non stai facendo un confronto di stringhe; stai facendo un confronto di date . Dovresti trasformare la tua stringa in una data. O usando il built-in TO_DATE() funzione o una data letterale.

TO_DATE()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Questo metodo presenta alcune insidie ​​non necessarie

  • Come indicato nei commenti a_horse_with_no_name, DEC , non significa necessariamente dicembre. Dipende dal tuo NLS_DATE_LANGUAGE e NLS_DATE_FORMAT impostazioni. Per assicurarti che il tuo confronto funzioni in qualsiasi locale, puoi utilizzare il modello di formato datetime MM invece
  • L'anno '95 non è esatto. Sai che intendi il 1995, ma se fosse il '50, è il 1950 o il 2050? È sempre meglio essere espliciti
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Valori letterali di data

Una data letterale fa parte dello standard ANSI, il che significa che non è necessario utilizzare una funzione specifica di Oracle. Quando usi un valore letterale devi specifica la tua data nel formato YYYY-MM-DD e non puoi includere un elemento temporale.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Ricorda che il tipo di dati Oracle date include un elemento temporale, quindi la data senza una parte temporale è equivalente a 1995-12-31 00:00:00 .

Se vuoi includere una porzione di tempo, dovresti usare un valore letterale di timestamp, che ha il formato YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Ulteriori informazioni

NLS_DATE_LANGUAGE è derivato da NLS_LANGUAGE e NLS_DATE_FORMAT è derivato da NLS_TERRITORY . Questi vengono impostati al momento della creazione del database ma possono essere modificati modificando il file dei parametri di inizializzazione - solo se realmente richiesto - oppure a livello di sessione utilizzando il ALTER SESSION sintassi. Ad esempio:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Ciò significa:

  • DD giorno numerico del mese, 1 - 31
  • MM mese numerico dell'anno, 01 - 12 (gennaio è 01)
  • YYYY Anno a 4 cifre:secondo me è sempre migliore di un anno YY a 2 cifre poiché non c'è confusione con il secolo a cui ti riferisci.
  • HH24 ora del giorno, 0 - 23
  • MI minuto dell'ora, 0 - 59
  • SS secondo del minuto, 0-59

Puoi scoprire la tua lingua corrente e le impostazioni della lingua della data eseguendo una query su V$NLS_PARAMETERSs e l'intera gamma di valori validi interrogando V$NLS_VALID_VALUES .

Ulteriori letture

  • Formatta modelli

Per inciso, se vuoi il count(*) devi raggruppare per employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Questo ti dà il conteggio per employee_id .