【问题标题】:Date field literal does not match format string日期字段文字与格式字符串不匹配
【发布时间】:2015-03-11 22:32:00
【问题描述】:

我有一个名为 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 - “文字与格式字符串不匹配”
*原因:输入中的文字必须与格式字符串中的文字长度相同(前导空格除外)。如果 “FX”修饰符已打开,文字必须完全匹配, 没有额外的空格。
*操作:更正格式字符串以匹配文字。

我尝试在前两种情况下插入 to_date(),但仍然收到相同的错误消息。我该如何解决这个问题?

【问题讨论】:

  • 您能否与to_date 通话分享失败的表达式?
  • 我试过了,但没用: WHEN floor(MONTHS_BETWEEN(sysdate, to_date(program_start_date))/12) 5 THEN '6+ years'

标签: sql oracle select date-formatting


【解决方案1】:

您的表达式隐含地假设数据库的默认 nls_date_format 与列的默认值匹配,正如您所看到的,这根本不是真的 - 即使是这样,做出这种假设也是一种不好的做法,因为它会使您的像蝴蝶翅膀一样脆弱的代码。

相反,您应该使用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

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2017-03-10
    • 2015-01-11
    • 2010-11-26
    • 2012-10-09
    相关资源
    最近更新 更多