Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Vergleichen von Daten in Oracle SQL

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 Ihrem NLS_DATE_LANGUAGE ab und NLS_DATE_FORMAT die Einstellungen. Um sicherzustellen, dass Ihr Vergleich mit jedem Gebietsschema funktioniert, können Sie das Datetime-Formatmodell MM 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 - 31
  • MM Numerischer Monat des Jahres, 01 - 12 ( Januar ist 01 )
  • YYYY 4-stellige Jahreszahl - meiner Meinung nach immer besser als ein zweistelliges 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 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 .