日期字段文字与格式字符串不匹配

时间:2015-01-13 20:42:02

标签: sql oracle select date-formatting

我有一个名为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(),但我仍然收到相同的错误消息。我该如何解决这个问题?

1 个答案:

答案 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