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.
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
‚05‘ muß nicht zwangsläufig ‚2005‘ ergeben …
Grüße,
Tomh
PS: Meiner Meinung nach hat Oracle trotz alledem ein äußerst ausgereifteste Datums-Haindling …
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).