我有一个名为program_start_date的字段,其格式为YYYYMM
。我需要确定这个日期是5年前发生还是更少,如果它发生在5年以前,或者它是否为空白。
我在SQL查询中有以下case语句:
CASE
WHEN floor(MONTHS_BETWEEN(sysdate, program_start_date)/12) <= 5 THEN '5 years or less'
WHEN floor(MONTHS_BETWEEN(sysdate, program_start_date)/12) > 5 THEN '6+ years'
WHEN program_start_date is null THEN 'Blank'
ELSE program_start_date
END
我收到以下错误消息:
ORA-01861:文字与格式字符串01861不匹配.00000 - &#34;文字与格式字符串不匹配&#34;
*原因:输入中的文字必须与格式字符串中的文字长度相同(前导空格除外)。如果 &#34; FX&#34;修改器已经切换,文字必须完全匹配, 没有额外的空白。
*操作:更正格式字符串以匹配文字。
我尝试在前两种情况下插入to_date()
,但我仍然收到相同的错误消息。我该如何解决这个问题?
答案 0 :(得分:3)
您的表达式隐含地假定数据库的默认nls_date_format
与列的默认值匹配,正如您所看到的那样,根本不是真的 - 即使它是,它也是&#39; sa做出这种假设的不良做法,因为它使你的代码像蝴蝶翅膀一样脆弱。
相反,您应该使用to_date
函数明确说明格式:
CASE
WHEN floor(MONTHS_BETWEEN(sysdate, TO_DATE(program_start_date, 'YYYMM'))/12) <= 5 THEN '5 years or less'
WHEN floor(MONTHS_BETWEEN(sysdate, TO_DATE(program_start_date, 'YYYMM'))/12) > 5 THEN '6+ years'
WHEN program_start_date is null THEN 'Blank'
ELSE program_start_date
END