请注意,包含星期几的任何 7 个连续日历日期的字符串表示必须将测试的星期几字符串作为子字符串,前提是测试的字符串有效。
因此,为了规避错误,请连接以 sysdate 开头的一周的字符串表示形式,并根据结果测试您的字符串:
SELECT CASE INSTR(
to_char ( sysdate + 0, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 1, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 2, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 3, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 4, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 5, 'Day, DD.MM.YYYY' )
|| to_char ( sysdate + 6, 'Day, DD.MM.YYYY' )
, '<the_string_to_test>' )
WHEN 0 THEN 'invalid'
ELSE 'valid'
END isvalid
FROM DUAL
;
作为一种改进,如果格式字符串和测试字符串可以在测试字符串是有效日期名称的子字符串的情况下防止误报,则围绕日期部分的分隔符。
SELECT CASE INSTR(
to_char ( sysdate + 0, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 1, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 2, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 3, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 4, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 5, '.FMDay., DD.MM.YYYY' )
|| to_char ( sysdate + 6, '.FMDay., DD.MM.YYYY' )
, '.' || '<the_string_to_test>' || '.')
WHEN 0 THEN 'invalid'
ELSE 'valid'
END isvalid
FROM DUAL
;
编辑/注释
在后一个示例中,请注意...
- 并非所有分隔符都有效(使用
.
[works] 和|
[fails] 测试)
FMDay
必须用作格式说明符以从星期几名称中修剪尾随空格
编辑#2
这是相同的(几乎)不需要字符串操作:
select
case when upper(:day_name) in
(
select to_char(sysdate + 0, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 1, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 2, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 3, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 4, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 5, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual union all
select to_char(sysdate + 6, 'FMDAY', 'NLS_DATE_LANGUAGE=''' || :nls_date_lang || '''') from dual
) then 'valid' else 'invalid'
end isvalid
from dual;