31-DEC-95 er ikke en streng, og det er 20-JUN-94 heller ikke . Det er numre med nogle ekstra ting tilføjet til sidst. Dette skal være '31-DEC-95' eller '20-JUN-94' - Bemærk det enkelte citat, ' . Dette vil gøre dig i stand til at lave en strengsammenligning.
Du laver dog ikke en strengsammenligning; du laver en datosammenligning . Du bør forvandle din streng til en dato. Enten ved at bruge den indbyggede TO_DATE() funktion eller en bogstavelig dato.
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Denne metode har et par unødvendige faldgruber
- Som a_horse_with_no_name bemærkede i kommentarerne,
DEC, betyder ikke nødvendigvis december. Det afhænger af dinNLS_DATE_LANGUAGEogNLS_DATE_FORMATindstillinger. For at sikre, at din sammenligning med fungerer i enhver lokalitet, kan du bruge dato- og tidsformatmodellenMMi stedet - Året '95 er upræcis. Du ved, du mener 1995, men hvad nu hvis det var '50, er det 1950 eller 2050? Det er altid bedst at være eksplicit
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Datobogstaver
En date literal er en del af ANSI-standarden, hvilket betyder, at du ikke behøver at bruge en Oracle-specifik funktion. Når du bruger en bogstavelig, skal angiv din dato i formatet YYYY-MM-DD og du kan ikke inkludere et tidselement.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Husk, at Oracle-datodatatypen inkluderer et tidselement, så datoen uden tidsdel svarer til 1995-12-31 00:00:00 .
Hvis du vil inkludere en tidsdel, skal du bruge et tidsstempel, 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'
Yderligere information
NLS_DATE_LANGUAGE er afledt af NLS_LANGUAGE og NLS_DATE_FORMAT er afledt af NLS_TERRITORY . Disse er indstillet, da du oprindeligt oprettede databasen, men de kan ændres ved at ændre din initialiseringsparameterfil - kun hvis det virkelig er nødvendigt - eller på sessionsniveauet ved at bruge ALTER SESSION syntaks. For eksempel:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Det betyder:
DDnumerisk dag i måneden, 1 - 31MMnumerisk måned i året, 01 - 12 ( januar er 01 )YYYY4-cifret årstal - efter min mening er dette altid bedre end et 2-cifret årstalYYda der ikke er nogen forveksling med hvilket århundrede du henviser til.HH24time på dagen, 0 - 23MIminut i timen, 0 - 59SSsekund i minuttet, 0-59
Du kan finde ud af dine aktuelle sprog- og datosprogindstillinger ved at forespørge V$NLS_PARAMETERSs og hele spektret af gyldige værdier ved at forespørge V$NLS_VALID_VALUES .
Yderligere læsning
- Formatér modeller
I øvrigt, hvis du vil have count(*) du skal gruppere efter employee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Dette giver dig optællingen pr. employee_id .