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 tuoNLS_DATE_LANGUAGE
eNLS_DATE_FORMAT
impostazioni. Per assicurarti che il tuo confronto funzioni in qualsiasi locale, puoi utilizzare il modello di formato datetimeMM
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 - 31MM
mese numerico dell'anno, 01 - 12 (gennaio è 01)YYYY
Anno a 4 cifre:secondo me è sempre migliore di un annoYY
a 2 cifre poiché non c'è confusione con il secolo a cui ti riferisci.HH24
ora del giorno, 0 - 23MI
minuto dell'ora, 0 - 59SS
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
.