2012-04-15 2 views
1

Ich habe gerade die OCA-Zertifizierung Frage überprüft und ich erkannte, dass etwas nicht stimmt. Sie fragen:Datatime-Format funktioniert nicht, wie der Oracle-Lehrer sagte

Please provide the time of hiring (HR user) from all users in ascending order

Also schrieb ich die nächste Abfrage:

SELECT employee_id, first_name, last_name, hire_date 
    FROM employees 
WHERE hire_date BETWEEN '01/01/80' AND '01/01/99' 
ORDER BY hire_date; 

und die instructoe sagen, das ist falsch, weil das Datatime ist falsch! das sollte '01 -JAN-80 'sein. Was? Das ist unglaublich!

Ich habe keine Datenbank auf meinem Laptop installiert, aber ich bin sicher, dass ich diese Abfrage mehrmals bei meiner letzten Arbeit ausführen und das Datenformat ist / und nicht -.

Jeder Vorschlag ist willkommen.

UPDATE

Getestet habe ich es nur in einem xe 10g und ist auf jeden Fall / und nicht -:

http://imageshack.us/photo/my-images/28/truethat.jpg/()

+6

Es hängt vom NLS-Datumsformat ab ... jeder von Ihnen könnte Recht haben. Sie haben die Zeichenfolge "01/01/80" jedoch nicht explizit in ein Datum konvertiert. – Ben

+1

Sie haben Recht. Das Standarddatumsformat für Oracle ist Day-MON-year. Wenn Sie Ihr Beispiel ausführen, erhalten Sie keinen gültigen Monatsfehler. Sie müssten Ihre Zeichenfolge in ein Datumsformat mit einer bestimmten Formatierung umwandeln, damit es wie folgt funktioniert: 'Wählen Sie * von Mitarbeitern aus, bei denen hire_date zwischen to_date ('01/01/1980 ',' MM/DD/YYYY ') und to_date (' 01.01.1999 ',' MM/TT/JJJJ ') 'es ist nicht das -/das hat dich vermasselt es ist die JAN – xQbert

+0

ich bin ziemlich sicher, dass das nicht wahr ist., In wenigen Momenten bin ich es getestet und getestet beweise es – hibigo

Antwort

4

Weder Sie noch Sie Lehrer korrekt sind. Einer von euch könnte zufällig gelegentlich richtig sein.

Wenn Sie ein Datum mit einer Zeichenfolge vergleichen, muss Oracle die Zeichenfolge in ein Datum konvertieren. Um dies zu tun, verwendet es die aktuelle NLS_DATE_FORMAT der Sitzung. Verschiedene Clients haben unterschiedliche Standardeinstellungen NLS_DATE_FORMAT - verschiedene Regionen verwenden unterschiedliche Standardformate und verschiedene Personen bevorzugen unterschiedliche Formate. Wenn Sie sich auf eine implizite Konvertierung verlassen, schlägt Ihr Code fehl, wenn die Sitzung NLS_DATE_FORMAT nicht Ihren Erwartungen entspricht. Und das bedeutet unweigerlich, dass der Code zum unpassendsten Zeitpunkt ausfallen wird.

Anstatt ein Datum mit einer Zeichenfolge zu vergleichen, sollten Sie immer ein Datum mit einem Datum vergleichen. Es gibt zwei Möglichkeiten, dies in Oracle zu tun. Erstens können Sie eine explizite TO_DATE mit dem entsprechenden Format-String, das heißt

SELECT employee_id, first_name, last_name, hire_date 
    FROM employees 
WHERE hire_date BETWEEN to_date('01/01/80','mm/dd/rr') AND to_date('01/01/99','mm/dd/rr') 
ORDER BY hire_date; 

Zweitens verwenden, können Sie ANSI Datumsliterale verwenden. ANSI-Datumsliterale verwenden immer das Format YYYY-MM-DD

SELECT employee_id, first_name, last_name, hire_date 
    FROM employees 
WHERE hire_date BETWEEN date '1980-01-01' AND date '1999-01-01' 
ORDER BY hire_date; 
+0

danke für Ihre ausführliche Antwort. – hibigo

3

Ich persönlich verlassen sich nicht auf implizite Konvertierung. Zu oft führt dies zu unerwartetem Leid auf der Straße. Wenn ich gebeten werde, einen Filter zwischen einem Datumsbereich bereitzustellen, wäre ich explizit. Wählen Sie, was Format Sie wollen, aber wenn es etwas verwirrend sein kann, dann versuchen, so viel von der Verwirrung wie möglich zu beseitigen:

SELECT employee_id, first_name, last_name, hire_date 
    FROM employees 
    WHERE hire_date BETWEEN TO_DATE('JAN-01-1980', 'MON-DD-YYYY') 
         AND TO_DATE('JAN-01-1999', 'MON-DD-YYYY') 
    ORDER BY hire_date; 
+0

+1 Konvertieren Sie immer explizit in den Produktionscode. Wenn Sie die lange Kette der übergeordneten Einstellungen berücksichtigen, sollten Sie niemals von der Einstellung NLS_DATE_FORMAT außerhalb Ihrer eigenen direkten Kontrolle abhängig sein. –

Verwandte Themen