2017-12-14 1 views
0

Hier meine Frage ist:Es ist eine einfache Abfrage, aber ich weiß nicht, warum

SELECT 
    COUNT(1) 
FROM (
    SELECT 
     TO_NUMBER(EXTRACT(YEAR FROM DATE'2017-01-01') - EXTRACT(YEAR FROM    
     TO_DATE(BIRTH_DAY, 'YYYYMMDD'))) AS AGE, 
     XX.* 
    FROM MEMBER_INFO XX 
    WHERE BIRTH_DAY IS NOT NULL 
) XXX 

, die ohne Fehler ausgeführt. Wenn ich jedoch hinzufügen, diese bis zum Ende der Abfrage:

WHERE XXX.AGE >= 30 AND XXX.AGE < 50 

bekomme ich folgende Fehlermeldung:

  1. 00000 - "input value not long enough for date format" (ORA-01840)

Warum dieser Fehler auftreten?

+0

Welche Fehlermeldung ??? – Bohemian

+0

ah es tut mir leid. Nachricht ist ** 01840. 00000 - "Eingabewert ist nicht lang genug für das Datumsformat" ** –

+0

Was meinst du mit "Bedingung hinzufügen"? Können Sie Ihre Frage bearbeiten, um die funktionierende Abfrage und die nicht funktionierende Abfrage anzuzeigen? Wir sind keine Gedankenleser; Ich für meinen Teil verstehe nicht, was du meinst. – Bohemian

Antwort

1

Ohne eine Bedingung auf AGE, die Berechnung TO_DATE(BIRTH_DAY, 'YYYYMMDD') ist nicht erforderlich, um die Ausgabe zu produzieren. Der Optimierer entfernt alle unnötigen Operationen, so wird die Abfrage einfach optimiert:

SELECT COUNT(*) 
FROM MEMBER_INFO 
WHERE BIRTH_DAY IS NOT NULL 

Dies ist ähnlich wie viele Compiler arbeiten - sie Stücke von Code zu entfernen, wenn es sicher ist, dass dies nicht auf das Ergebnis von Ausführung.

Mit der Bedingung an Ort und Stelle muss die Berechnung vorgenommen werden und leider haben Sie einen Wert für BIRTH_DAY, die nicht als YYYYMMDD Datum analysiert werden kann, weil es zu kurz ist - daher der Fehler.

Sie könnten diesen Fehler vermeiden, indem den inneren Zustand zu ändern zu:

WHERE LENGTH(BIRTH_DAY) = 8 

die auch NULL Werte ausschließen würde nach wie vor.

+0

danke. Ihr Rat war eine gute Hilfe. –

Verwandte Themen