2016-08-17 104 views
0

我有一個查詢作爲一個較大的功能的一部分,並有麻煩使DECODE工作與空日期。我查詢的這個部分是查詢的WHERE條件:甲骨文解碼空日期變量

NVL(datRunDate,SYSDATE) 
BETWEEN NVL(EFFECTIVE_DATE,NVL(datRunDate,SYSDATE-1)) 
AND DECODE(STOP_DATE, NULL, NVL(datRunDate,SYSDATE + 1), STOP_DATE + (59/86400)) 

其中:

datRunDate  DATE 
EFFECTIVE_DATE DATE 
STOP_DATE  DATE 

我的問題是,STOP_DATE通常NULLDECODE不起作用。任何想法/幫助解決這個問題,表示讚賞。

編輯 添加一些樣本數據表明:

datRunDate  2016-01-14 06:41:54 
EFFECTIVE_DATE 2013-04-01 09:53:00 
STOP_DATE  NULL 

EDIT2 這裏添加整個查詢文本,問題可能就出在這裏。注意:我已經手動替換了這些變量。使用簡單的SELECT INTO語句在查詢之前填充這些變量。

datRunDate  DATE; 

SELECT COMP_DATE INTO datRunDate where IDL_SEQ = 2320; 

enter image description here

enter image description here

SELECT EFFECTIVE_DATE, STOP_DATE from IDLS where IDL_SEQ = 2320; 

enter image description here

enter image description here

DESC IDL_TABLE

enter image description here

DESC SCHEDULES COMP_DATE = datRunDate

enter image description here ...

SELECT I.IDL_SEQ   
    FROM IDLS I, IDL_CMPS IC 
    WHERE I.RECORD_TYPE = 'M' 
    AND IC.IDL_SEQ = I.IDL_SEQ 
    AND IC.CMP = '71-43-2' 
    AND I.METHOD = 'N0'   
    AND ((I.RUN_INSTRU = '') OR (I.RUN_INSTRU IS NULL)) 
    AND ((I.PREP_METHOD = 'K9') OR (I.PREP_METHOD IS NULL)) 
    AND ((I.MATRIX = 'SO') OR (I.MATRIX IS NULL)) 
    AND ((I.COLUMN_ID = '') OR (I.COLUMN_ID IS NULL)) 
    AND COALESCE(datRunDate, SYSDATE) 
    BETWEEN COALESCE(I.EFFECTIVE_DATE, datRunDate, SYSDATE - 1) 
    AND COALESCE(I.STOP_DATE + (59/86400), datRunDate, SYSDATE + 1) 
    AND ((I.SAMPLE_TYPE = 'SAMPLE') OR (SAMPLE_TYPE IS NULL)) 
    AND ((I.CUST_SAMPLE_ID = 'SB-7') OR (CUST_SAMPLE_ID IS NULL)) 
    AND ((I.LOCATION = '') OR (LOCATION IS NULL))   
    AND (
     (OTHER_CRITERIA IS NOT NULL AND 404324 IS NOT NULL AND OTHER_CRITERIA = 'P|'||404324) OR 
     (OTHER_CRITERIA IS NOT NULL AND 28936 IS NOT NULL AND OTHER_CRITERIA = 'R|'||28936) OR 
     (OTHER_CRITERIA IS NOT NULL AND 'ECO' IS NOT NULL AND OTHER_CRITERIA = 'C|'||'ECO') OR 
     (OTHER_CRITERIA IS NULL)); 

現在,當我運行此我得到:ORA-00932:不一致的數據類型:預期CHAR了DATE

+0

您確定您的日期字段中沒有「默認」值嗎?即使空日期,解碼似乎也能正常工作;例如,這會給出sysdate:'雙重'select decode(null,null,sysdate,sysdate-100)' – Aleksej

+0

'datRunDate'和'EFFECTIVE_DATE'中的所有值都是日期。 –

+0

他們是日期,好的,但有可能你有,例如,01/01/0001而不是null? – Aleksej

回答

1

我會這樣寫:

COALESCE(datRunDate, SYSDATE) BETWEEN COALESCE(EFFECTIVE_DATE, datRunDate, SYSDATE - 1) AND 
             COALESCE(STOP_DATE + (59/86400), dateRunDate, SYSDATE + 1) 

ANSI標準功能COALESCE()比使用NVL()DECODE()(無論如何應該被廢棄)更簡單。

+0

謝謝你,但它仍然不會爲我返回任何東西。如果我將最後一個條件'COALESCE(STOP_DATE +(59/86400),dateRunDate,SYSDATE + 1)'改爲'datRunDate'就可以正常工作。 –

+0

@random_answer_guy。 。 。我很確定你的代碼中的邏輯是在這個答案中實現的。我不能說基於未知要求的邏輯*應該是什麼。 –

+0

這是正確的答案,我有另一個問題,使得它似乎失敗了,謝謝你的幫助。 –