31-DEC-95
ist keine Zeichenfolge, noch ist 20-JUN-94
. Es sind Zahlen mit ein paar zusätzlichen Dingen am Ende. Dies sollte sein '31-DEC-95'
oder '20-JUN-94'
- beachten Sie das einfache Anführungszeichen , '
. Auf diese Weise 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 mithilfe der integrierten TO_DATE()
Funktion oder eines Datumsliteral .
MITEINANDER AUSGEHEN()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Diese Methode weist einige unnötige Fallstricke auf
- Wie a_horse_with_no_name in den Kommentaren vermerkt
DEC
, bedeutet dies nicht unbedingt Dezember. Es hängt von Ihren NLS_DATE_LANGUAGE
und NLS_DATE_FORMAT
Einstellungen ab. Um sicherzustellen, dass Ihr Vergleich mit der Arbeit in einem beliebigen Gebietsschema funktioniert, können Sie stattdessen das Datums- / Uhrzeitformatmodell MM
verwenden
- Das Jahr '95 ist ungenau. Sie wissen, Sie meinen 1995, aber was ist, wenn es '50 war, 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, dh Sie müssen keine Oracle-spezifische Funktion verwenden. Wenn Sie ein Literal verwenden, müssen Sie Ihr Datum im Format angeben YYYY-MM-DD
und dürfen kein Zeitelement einfügen.
select employee_id
from employee
where employee_date_hired > date '1995-12-31'
Beachten Sie, dass der Oracle-Datumsdatentyp ein Zeitelement enthält, sodass das Datum ohne Zeitanteil gleich ist 1995-12-31 00:00:00
.
Wenn Sie einen Zeitabschnitt einschließen möchten, müssen Sie ein Zeitstempelliteral verwenden, das das Format annimmt YYYY-MM-DD HH24:MI:SS[.FF0-9]
select employee_id
from employee
where employee_date_hired > timestamp '1995-12-31 12:31:02'
Weitere Informationen
NLS_DATE_LANGUAGE
wird abgeleitet von NLS_LANGUAGE
und NLS_DATE_FORMAT
wird abgeleitet von NLS_TERRITORY
. Diese werden beim erstmaligen Erstellen der Datenbank festgelegt. Sie können jedoch geändert werden, indem Sie Ihre Initialisierungsparameterdatei ändern - nur wenn dies wirklich erforderlich ist - oder auf Sitzungsebene mithilfe der ALTER SESSION
Syntax. Zum Beispiel:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Das heisst:
DD
numerischer Tag des Monats, 1 - 31
MM
numerischer Monat des Jahres, 01 - 12 (Januar ist 01)
YYYY
4-stelliges Jahr - meiner Meinung nach ist dies immer besser als ein 2-stelliges Jahr, YY
da es keine Verwechslung mit dem Jahrhundert gibt, auf das Sie sich beziehen.
HH24
Stunde des Tages, 0 - 23
MI
Minute der Stunde, 0 - 59
SS
Sekunde der Minute, 0-59
Sie können Ihre aktuellen Sprach- und Datumsspracheneinstellungen durch Abfragen V$NLS_PARAMETERSs
und die gesamte Bandbreite gültiger Werte durch Abfragen ermitteln V$NLS_VALID_VALUES
.
Weiterführende Literatur
Übrigens, wenn Sie das wollen count(*)
, müssen Sie nach gruppierenemployee_id
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
.
> <
oderBETWEEN '' AND ''