31-DEC-95
non è una stringa, né lo è 20-JUN-94
. Sono numeri con alcune cose extra aggiunte alla fine. Questo dovrebbe essere '31-DEC-95'
o '20-JUN-94'
- notare l'apostrofo, '
. Ciò ti consentirà di fare un confronto tra stringhe.
Tuttavia, non stai facendo un confronto tra stringhe; stai facendo un confronto tra le date . Devi trasformare la tua stringa in una data. O utilizzando la TO_DATE()
funzione integrata o una data letterale .
AD OGGI()
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 notato da a_horse_with_no_name nei commenti,
DEC
non significa necessariamente dicembre. Dipende dal tuo NLS_DATE_LANGUAGE
e dalle NLS_DATE_FORMAT
impostazioni. Per garantire che il confronto con funzioni in qualsiasi locale, è possibile utilizzare invece il modello di formato datetime MM
- L'anno '95 è inesatto. Sai che vuoi dire 1995, ma se fosse il '50, quel 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')
Letterali di data
Una data letterale fa parte dello standard ANSI, il che significa che non è necessario utilizzare una funzione specifica Oracle. Quando si utilizza un valore letterale, è necessario specificare la data nel formato YYYY-MM-DD
e non è possibile includere un elemento orario.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Ricorda che il tipo di dati della data Oracle include un elemento orario, quindi la data senza una porzione oraria è equivalente a 1995-12-31 00:00:00
.
Se si desidera includere una porzione temporale, è necessario utilizzare un valore letterale timestamp, che assume 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
deriva da NLS_TERRITORY
. Questi vengono impostati al momento della creazione iniziale del database ma possono essere modificati modificando il file dei parametri di inializzazione - solo se realmente richiesto - o a livello di sessione utilizzando la ALTER SESSION
sintassi. Per esempio:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Questo significa:
DD
giorno numerico del mese, 1 - 31
MM
mese numerico dell'anno, 01 - 12 (gennaio è 01)
YYYY
Anno a 4 cifre - a mio avviso, è sempre meglio di un anno a 2 cifre YY
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
È possibile scoprire la lingua corrente e le impostazioni della lingua della data eseguendo una query V$NLS_PARAMETERSs
e l'intera gamma di valori validi eseguendo una query V$NLS_VALID_VALUES
.
Ulteriori letture
Per inciso, se si desidera che count(*)
è necessario raggruppareemployee_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
.
> <
oBETWEEN '' AND ''