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_LANGUAGEeNLS_DATE_FORMATimpostazioni. Per assicurarti che il tuo confronto funzioni in qualsiasi locale, puoi utilizzare il modello di formato datetimeMMinvece - 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:
DDgiorno numerico del mese, 1 - 31MMmese numerico dell'anno, 01 - 12 (gennaio è 01)YYYYAnno a 4 cifre:secondo me è sempre migliore di un annoYYa 2 cifre poiché non c'è confusione con il secolo a cui ti riferisci.HH24ora del giorno, 0 - 23MIminuto dell'ora, 0 - 59SSsecondo 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 .