31-DEC-95
är inte en sträng och inte heller 20-JUN-94
. Det är siffror med lite extra saker på slutet. Detta bör vara '31-DEC-95'
eller '20-JUN-94'
- notera det enda citatet, '
. Detta gör att du kan göra en strängjämförelse.
Men du gör inte en strängjämförelse; du gör en datumjämförelse . Du bör förvandla din sträng till ett datum. Antingen genom att använda den inbyggda TO_DATE()
funktion, eller ett bokstavligt datum.
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Denna metod har några onödiga fallgropar
- Som a_horse_with_no_name noterade i kommentarerna,
DEC
, betyder inte nödvändigtvis december. Det beror på dinNLS_DATE_LANGUAGE
ochNLS_DATE_FORMAT
inställningar. För att säkerställa att din jämförelse med fungerar i alla språk kan du använda formatmodellen för datum och tidMM
istället - Året 95 är inexakt. Du vet att du menar 1995, men tänk om det var 50, är det 1950 eller 2050? Det är alltid bäst att vara tydlig
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Datumbokstav
En bokstavlig datum är en del av ANSI-standarden, vilket innebär att du inte behöver använda en Oracle-specifik funktion. När du använder en bokstavlig måste ange ditt datum i formatet YYYY-MM-DD
och du kan inte inkludera ett tidselement.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Kom ihåg att Oracles datumdatatyp inkluderar ett tidselement, så datumet utan tidsdel motsvarar 1995-12-31 00:00:00
.
Om du vill inkludera en tidsdel måste du använda en tidsstämpel bokstavlig, som har formatet YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Ytterligare information
NLS_DATE_LANGUAGE
härleds från NLS_LANGUAGE
och NLS_DATE_FORMAT
härleds från NLS_TERRITORY
. Dessa ställs in när du först skapade databasen men de kan ändras genom att ändra din initialiseringsparametrarfil - endast om det verkligen krävs - eller på sessionsnivå genom att använda ALTER SESSION
syntax. Till exempel:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Det betyder:
DD
numerisk dag i månaden, 1 - 31MM
numerisk månad på året, 01–12 (januari är 01)YYYY
4-siffrigt år - enligt min mening är detta alltid bättre än ett tvåsiffrigt årtalYY
eftersom det inte finns någon förväxling med vilket århundrade du syftar på.HH24
timme på dygnet, 0 - 23MI
minut i timmen, 0 - 59SS
sekund i minuten, 0-59
Du kan ta reda på dina aktuella språk- och datumspråkinställningar genom att fråga V$NLS_PARAMETERSs
och hela omfånget av giltiga värden genom att fråga V$NLS_VALID_VALUES
.
Mer läsning
- Formatera modeller
För övrigt, om du vill ha count(*)
du måste gruppera efter employee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Detta ger dig antalet per employee_id
.