Oracle Case Statement,日期值不是有效月份

时间:2016-05-12 18:00:17

标签: oracle

我有以下案例陈述,但我想补充案例陈述,其中END_DT是1/1/3000归类为开放。

CASE WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL 
THEN 'Closed' ELSE 'Open' END AS Enrolled

我得到以下结果,但在这种情况下,这应该在登记栏下归类为未结

我已尝试添加案例数据但我收到错误。

一个 - 不一致的数据类型;预计日期得到的数字 二 - 在日期中添加“1/1/3000” - 不是有效月份。

帮助将不胜感激。

 id  End_dt          Reason  Enrolled
  1    1/1/3000               Closed

2 个答案:

答案 0 :(得分:1)

感谢mathguy提醒我有关ANSI标准日期格式的信息。我改变了我的例子,假设x.END_dt是DATE数据类型:

  CASE
    WHEN x.END_dt = date '3000-01-01'
      THEN 'Open'
    WHEN x.END_dt IS NULL AND REASON IS NULL
      THEN 'Open'
    WHEN x.END_dt IS NOT NULL OR REASON IS NOT NULL
      THEN 'Closed'
    ELSE 'Unexpected x.END_dt value: ' || to_char(x.END_dt)
  END AS Enrolled

我还收紧了case语句来处理意外的END_dt值并在他们自己的'WHEN'行显式测试条件。我喜欢这样做,因为这样测试的目的很明确,很明显当通过调试器(如Toad)时正在测试哪个表达式,并且当客户端不可避免地想要改变事物时,它很容易移动一行或者当他们在自己的路线上时,改变测试的顺序。

答案 1 :(得分:1)

为避免依赖NLS_DATE_FORMAT,可以使用ANSI标准日期格式(Oracle支持):WHEN x.end_dt = date '3000-01-01' THEN ...。整个CASE表达式可以这样写:

CASE
  WHEN x.end_dt = date '3000-01-01' OR (x.end_dt IS NULL AND x.reason IS NULL)
    THEN 'Open'
  ELSE   'Closed'
END AS enrolled