it-swarm.com.de

Vergleichen von Daten in Oracle SQL

Ich versuche, die Anzahl der Mitarbeiter anzuzeigen, die nach dem 20. Juni 1994 eingestellt wurden. Es wird jedoch die Fehlermeldung "JUN 'ungültige Kennung" angezeigt. Bitte helfen Sie, danke!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 
124
user1336830

31-DEC-95 ist weder eine Zeichenfolge noch 20-JUN-94. Das sind Zahlen mit ein paar zusätzlichen Sachen am Ende. Dies sollte '31-DEC-95' oder '20-JUN-94' sein - 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 mit der eingebauten Funktion TO_DATE() oder mit einem Datumsliteral .

MITEINANDER AUSGEHEN()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Diese Methode hat einige unnötige Fallstricke

  • Wie ein Pferd mit keinem Namen in den Kommentaren vermerkt ist, bedeutet DEC nicht notwendigerweise Dezember. Dies hängt von Ihren Einstellungen für NLS_DATE_LANGUAGE und NLS_DATE_FORMAT ab. Um sicherzustellen, dass Ihr Vergleich mit der Arbeit in einem beliebigen Gebietsschema erfolgt, können Sie stattdessen das Datum/Uhrzeit-FormatmodellMM verwenden
  • Das Jahr '95 ist ungenau. Sie wissen, Sie meinen 1995, aber was ist, wenn es 1950 oder 2050 war? 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 YYYY-MM-DD angeben , 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 Oracle-Datums-Datentyp ein Zeitelement enthält, sodass das Datum ohne Zeitangabe 1995-12-31 00:00:00 entspricht.

Wenn Sie einen Zeitabschnitt einfügen möchten, müssen Sie ein Zeitstempel-Literal 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 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 die Datei mit den Inialisierungsparametern ändern - nur wenn dies wirklich erforderlich ist - oder indem Sie auf Sitzungsebene die Syntax ALTER SESSION verwenden. 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 gibt Auf welches Jahrhundert beziehen Sie sich?.
  • 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 ermitteln, indem Sie V$NLS_PARAMETERSs abfragen, und die vollständige Palette der gültigen Werte, indem Sie V$NLS_VALID_VALUES abfragen.

Weitere Lektüre


Übrigens, wenn Sie die count(*) wollen, müssen Sie 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.

270
Ben

Fazit,

to_char arbeitet auf seine eigene Weise

Damit,

Verwenden Sie zum Vergleich immer dieses Format JJJJ-MM-TT anstelle von MM-TT-JJ oder TT-MM-JJJJ oder eines anderen Formats

5
akshay gulawane

Sie können trunc und to_date wie folgt verwenden:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
4

von Ihrer Anfrage:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 

ich denke, es ist nicht angebracht, die Anzahl der Mitarbeiter anzuzeigen, die nach dem 20. Juni 1994 eingestellt wurden. Wenn Sie die Anzahl der Mitarbeiter anzeigen möchten, können Sie Folgendes verwenden:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

Ich denke, für Best Practice zum Vergleichen von Daten können Sie Folgendes verwenden:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
2
viduka