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_LANGUAGE
ogNLS_DATE_FORMAT
indstillinger. For at sikre, at din sammenligning med fungerer i enhver lokalitet, kan du bruge dato- og tidsformatmodellenMM
i 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:
DD
numerisk dag i måneden, 1 - 31MM
numerisk måned i året, 01 - 12 ( januar er 01 )YYYY
4-cifret årstal - efter min mening er dette altid bedre end et 2-cifret årstalYY
da der ikke er nogen forveksling med hvilket århundrede du henviser til.HH24
time på dagen, 0 - 23MI
minut i timen, 0 - 59SS
sekund 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
.