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_LANGUAGEochNLS_DATE_FORMATinstä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 tidMMistä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:
DDnumerisk dag i månaden, 1 - 31MMnumerisk månad på året, 01–12 (januari är 01)YYYY4-siffrigt år - enligt min mening är detta alltid bättre än ett tvåsiffrigt årtalYYeftersom det inte finns någon förväxling med vilket århundrade du syftar på.HH24timme på dygnet, 0 - 23MIminut i timmen, 0 - 59SSsekund 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 .