DATE-Feld in der Oracle-DB

Hallo,
ich habe ein Feld „Transport_Beginn“(Date) in der Tabelle Transfer_Order. In der Tabelle habe ich einen Eintrag „13.01.2005 10:15:59“ Und wenn ich diese Tabelle nach „Transport_Beginn“ durchsuchen möchte, habe ich ein Problem festgestellt.

Vergleiche ich mit ,=, dann kann ich für das Jahr entweder zwei- oder vierstellig eingeben:
SELECT * FROM Transfer_Order WHERE Transport_Begin >= ‚13.01.2005‘ oder
SELECT * FROM Transfer_Order WHERE Transport_Begin >= ‚13.01.05‘ liefert mir ein Ergebniss zurück.

Vergleiche ich aber mit LIKE, dann kann ich für das Jahr nur zweistellig eingeben:
SELECT * FROM Transfer_Order WHERE TR_Begin LIKE ‚13.01.05%‘ liefert mir ein Ergebniss und
SELECT * FROM Transfer_Order WHERE TR_Begin LIKE ‚13.01.2005%‘ liefert mir kein Ergebniss zurück.

Weiss vielleicht jemand wieso nicht?

mfg Christoph

Hi!

Wie lauten die NLS-Einstellungen der Datenbank?

SELECT * FROM Transfer_Order WHERE TR_Begin LIKE ‚13.01.05%‘
liefert mir ein Ergebniss und
SELECT * FROM Transfer_Order WHERE TR_Begin LIKE ‚13.01.2005%‘
liefert mir kein Ergebniss zurück.

Für Datumsvergleiche mit ‚LIKE‘ (und zusätzlich im String-Format!!) sind manche Leute schon geteert und gefedert worden :wink:

‚05‘ muß nicht zwangsläufig ‚2005‘ ergeben …

Grüße,
Tomh

PS: Meiner Meinung nach hat Oracle trotz alledem ein äußerst ausgereifteste Datums-Haindling …

Die Einstellung ist: NLS_DATE_FORMAT = ‚DD.MM.YYYY HH24:MI:SS‘ oder meinst du mit NLS was anderes?

‚05‘ muß nicht zwangsläufig ‚2005‘ ergeben …

Wenn ‚05‘ nicht ‚2005‘ bedeuten sollte, wieso bekomme ich einen richtigen Ergebniss zurück?

mfg Christoph

Vermutlich weil Du zufällig die Datumsformateinstellung in Deinem Server aktiviert hast.

Absolut gefährlich mit LIKE auf das Datum zuzugreifen.

Du wirst auch alle Datensätze vom Mai und jeden 5. des Monats bekommen. Bist Du sicher, dass Du das willst?

Sauber macht mans, indem man das Jahr aus dem Datum mit einer Funktion extrahiert und dann vergleicht.

Gruß

Peter

Hallo Christoph!

Das ist äußerst unsicher, was du da vorhast:

Vergleiche ich mit ,=, dann kann ich für das Jahr
entweder zwei- oder vierstellig eingeben:
SELECT * FROM Transfer_Order WHERE Transport_Begin >=
‚13.01.2005‘ oder
SELECT * FROM Transfer_Order WHERE Transport_Begin >=
‚13.01.05‘ liefert mir ein Ergebniss zurück.

Das geht manchmal, manchmal auch nicht: Führe bitte mal folgende Statements in SQL*Plus aus:

alter session set nls\_date\_format='MM/DD/YYYY';
select \* from transfer\_order 
 where transport\_begin \>= '12.01.2005';
alter session set nls\_date\_format='DD.MM.YYYY';
select \* from transfer\_order 
 where transport\_begin \>= '12.01.2005';

Offensichtlich verlässt sich also dein Statement auf eine Client-Einstellung. Das ist suboptimal und führt im Zweifelsfall immer zum Fehler (besonders, wenn du im ersten Fall den 13.01.2005 nimmst). Ersteres Format ist aber Standard(!) wenn du den Client auf einem englischen Rechner installierst.
Deshalb auch hier immer so vergleichen:

select \* from transfer\_order 
 where transport\_begin \>= to\_date('12.01.2005','DD.MM.YYYY');

Der funktioniert dann unabhängig von den lokalen NLS Einstellungen.
Der LIKE macht’s nur noch schlimmer. Wenn du denn gar nicht drauf verzichten willst (tomh aund Peter haben ja ihre Meinung dazu schon vermeldet), dann nur so:

select \* from transfer\_order 
 where to\_char(transport\_begin,'DD.MM.YYYY HH24:MI') like
 to\_char(to\_date('12.01.2005', 'DD.MM.YYYY'), 'DD.MM.YYYY')||'%';

Ganz nebenbei zerschiesst du dir damit übrigens auch noch einen eventuellen Index auf transport_begin (ausser einen FBI).

Gruß
Martin