2016-05-12 50 views
0

我有下面的案例陈述,但我想补充说明END_DT是1/1/3000分类为Open的案例陈述。带有日期值不是有效月份的Oracle案例声明

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

我得到下面的结果,但在这种情况下,这应该已登记列

我试着增加了案例Statment下被归类为开放的,但我得到的错误。

一个不一致的数据类型;预计日期得到编号 两个 - 将“1/1/3000”添加到日期 - 不是有效的月份。

帮助将不胜感激。

id End_dt   Reason Enrolled 
    1 1/1/3000    Closed 
+0

请出示了一个完整的,有效的SQL语句 – OldProgrammer

回答

1

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

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 

我也收紧的情况下语句来处理意外END_DT值并明确测试自己的“当”线的条件。我喜欢这样做,因为测试的目的是明确的,当通过调试器(如Toad)时,哪个表达式正在测试,以及当客户端不可避免地想要改变事情时很容易移动一条线或改变测试顺序时,他们在自己的台词。

+0

我指正 –

+0

你能解释一下什么“意外x.END_dt值:” || to_char(x.END_dt)在干什么?谢谢! – Toby

+0

@Toby它将END_dt值连接到末尾的消息返回。只是为了展示一种处理异常的方式。事实上,你不会返回这个,而是通过日志或电子邮件发送它。 –

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 
+0

我总是忘记ANSI标准日期,谢谢你。我将会更新上面的示例。 –

+0

当我更改为ANSI标准日期格式时,出现错误 - “文字与格式字符串不匹配”。 '01 -JAN-3000'工作正常,但为什么我应该使用ANSI标准日期格式,以及如何修复错误? – Toby

+0

你可以请你发布你的查询部分,你得到的错误 - 完全按照你写的? ANSI标准日期格式不使用格式字符串,但如果我没有看到它,我不能说出代码有什么问题。 – mathguy