2016-05-12 51 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