Det här är en dålig idé. Den enda sättet att verifiera att ett datum är korrekt är att försöka konvertera det till ett datum. Om konverteringen misslyckas är det inte ett datum; om det är framgångsrikt kan det det vara. Datum är alldeles för komplexa för att ett vanligt språk ska kunna analysera.
Så skapa en funktion som omvandlar den till ett datum; du kan göra om mycket mer generisk än du har här, så den kan sedan återanvändas för andra ändamål:
create or replace function validate_date (
PDate in varchar2
, PDateFormat in varchar2
) return date is
begin
return to_date(PDate, PDateFormat);
exception when others then
return null;
end;
Detta returnerar ett datum om det kan verifiera att datum- och datumformatet matchar, annars returneras NULL om det finns något fel. Din fråga blir då:
select 'P' from dual where validate_date('20140506', 'yyyymmdd') is not null