31-DEC-95
is geen string, noch is 20-JUN-94
. Het zijn nummers met wat extra dingen aan het einde. Dit moet '31-DEC-95'
. zijn of '20-JUN-94'
- let op het enkele aanhalingsteken, '
. Hiermee kunt u een stringvergelijking maken.
U doet echter geen stringvergelijking; je doet een datumvergelijking . Je moet je string in een datum veranderen. Ofwel door gebruik te maken van de ingebouwde TO_DATE()
functie, of een letterlijke datum.
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Deze methode heeft een paar onnodige valkuilen
- Zoals a_horse_with_no_name opmerkte in de opmerkingen,
DEC
, betekent niet noodzakelijk december. Het hangt af van uwNLS_DATE_LANGUAGE
enNLS_DATE_FORMAT
instellingen. Om er zeker van te zijn dat uw vergelijking met werk in elke taal werkt, kunt u het datetime-formaatmodelMM
. gebruiken in plaats daarvan - Het jaar '95 is onnauwkeurig. Je weet dat je 1995 bedoelt, maar wat als het '50 was, is dat 1950 of 2050? Het is altijd het beste om expliciet te zijn
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Letterlijke datums
Een letterlijke datum is onderdeel van de ANSI-standaard, wat betekent dat u geen Oracle-specifieke functie hoeft te gebruiken. Wanneer u een letterlijke gebruikt u moet specificeer uw datum in het formaat YYYY-MM-DD
en u kunt geen tijdselement opnemen.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Onthoud dat het datatype Oracle-datum een tijdelement bevat, dus de datum zonder tijdgedeelte is gelijk aan 1995-12-31 00:00:00
.
Als u een tijdsgedeelte wilt opnemen, moet u een letterlijke tijdstempel gebruiken, die de indeling YYYY-MM-DD HH24:MI:SS[.FF0-9]
heeft.
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Meer informatie
NLS_DATE_LANGUAGE
is afgeleid van NLS_LANGUAGE
en NLS_DATE_FORMAT
is afgeleid van NLS_TERRITORY
. Deze worden ingesteld toen u de database voor het eerst aanmaakte, maar ze kunnen worden gewijzigd door uw bestand met initialisatieparameters te wijzigen - alleen als dit echt nodig is - of op sessieniveau met behulp van de ALTER SESSION
syntaxis. Bijvoorbeeld:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Dit betekent:
DD
numerieke dag van de maand, 1 - 31MM
numerieke maand van het jaar, 01 - 12 ( januari is 01 )YYYY
4-cijferig jaar - naar mijn mening is dit altijd beter dan een jaartal van 2 cijfersYY
aangezien er geen verwarring bestaat over de eeuw waarnaar u verwijst.HH24
uur van de dag, 0 - 23MI
minuut van het uur, 0 - 59SS
seconde van de minuut, 0-59
U kunt uw huidige taal- en datumtaalinstellingen achterhalen door V$NLS_PARAMETERSs
op te vragen. en het volledige scala aan geldige waarden door V$NLS_VALID_VALUES
op te vragen .
Verder lezen
- Modellen opmaken
Overigens, als u de count(*)
je moet groeperen op employee_id
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Dit geeft je het aantal per employee_id
.