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_LANGUAGE
ab undNLS_DATE_FORMAT
die Einstellungen. Um sicherzustellen, dass Ihr Vergleich mit jedem Gebietsschema funktioniert, können Sie das Datetime-FormatmodellMM
verwenden 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:
DD
Numerischer Tag des Monats, 1 - 31MM
Numerischer Monat des Jahres, 01 - 12 ( Januar ist 01 )YYYY
4-stellige Jahreszahl - meiner Meinung nach immer besser als ein zweistelliges JahrYY
da es keine Verwechslung mit dem Jahrhundert gibt, auf das Sie sich beziehen.HH24
Stunde des Tages, 0 - 23MI
Minute der Stunde, 0 - 59SS
Sekunde 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
.