31-DEC-95 ist kein String und 20-JUN-94 auch nicht . Es sind Nummern, denen am Ende etwas Extra hinzugefügt wurde. Dies sollte '31-DEC-95' sein oder '20-JUN-94' - Beachten Sie das einfache Anführungszeichen ' . Dadurch können Sie einen Zeichenfolgenvergleich durchführen.
Sie führen jedoch keinen Zeichenfolgenvergleich durch; Sie führen einen Datumsvergleich durch . Sie sollten Ihre Zeichenfolge in ein Datum umwandeln. Entweder mit dem eingebauten TO_DATE() Funktion oder ein Datumsliteral.
TO_DATE()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Diese Methode hat ein paar unnötige Fallstricke
- Wie a_horse_with_no_name in den Kommentaren anmerkte,
DEC, bedeutet nicht unbedingt Dezember. Das hängt von IhremNLS_DATE_LANGUAGEab undNLS_DATE_FORMATdie Einstellungen. Um sicherzustellen, dass Ihr Vergleich mit jedem Gebietsschema funktioniert, können Sie das Datetime-FormatmodellMMverwenden stattdessen - Das Jahr '95 ist ungenau. Du weißt, du meinst 1995, aber was wäre, wenn es 50 wäre, ist das 1950 oder 2050? Es ist immer am besten, explizit zu sein
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Datumsliterale
Ein Datumsliteral ist Teil des ANSI-Standards, was bedeutet, dass Sie keine Oracle-spezifische Funktion verwenden müssen. Wenn Sie ein Literal verwenden, müssen Sie es müssen Geben Sie Ihr Datum im Format YYYY-MM-DD an und Sie können kein Zeitelement einfügen.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Denken Sie daran, dass der Datumsdatentyp von Oracle ein Zeitelement enthält, sodass das Datum ohne Zeitteil 1995-12-31 00:00:00 entspricht .
Wenn Sie einen Zeitabschnitt einschließen möchten, müssen Sie ein Zeitstempelliteral verwenden, das das Format YYYY-MM-DD HH24:MI:SS[.FF0-9] hat
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Weitere Informationen
NLS_DATE_LANGUAGE wird von NLS_LANGUAGE abgeleitet und NLS_DATE_FORMAT wird von NLS_TERRITORY abgeleitet . Diese werden gesetzt, als Sie die Datenbank ursprünglich erstellt haben, aber sie können geändert werden, indem Sie Ihre Initialisierungsparameterdatei ändern - nur wenn es wirklich erforderlich ist - oder auf Sitzungsebene, indem Sie ALTER SESSION verwenden Syntax. Zum Beispiel:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Das bedeutet:
DDNumerischer Tag des Monats, 1 - 31MMNumerischer Monat des Jahres, 01 - 12 ( Januar ist 01 )YYYY4-stellige Jahreszahl - meiner Meinung nach immer besser als ein zweistelliges JahrYYda es keine Verwechslung mit dem Jahrhundert gibt, auf das Sie sich beziehen.HH24Stunde des Tages, 0 - 23MIMinute der Stunde, 0 - 59SSSekunde der Minute, 0-59
Sie können Ihre aktuellen Sprach- und Datumsspracheinstellungen herausfinden, indem Sie V$NLS_PARAMETERSs abfragen und den vollen Umfang gültiger Werte durch Abfrage von V$NLS_VALID_VALUES .
Weiterführende Literatur
- Modelle formatieren
Übrigens, wenn Sie den count(*) wollen Sie müssen nach employee_id gruppieren
select employee_id, count(*)
from employee
where employee_date_hired > date '1995-12-31'
group by employee_id
Dies gibt Ihnen die Anzahl pro employee_id .