2016-08-17 100 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

这是正确的答案,我有另一个问题,使得它似乎失败了,谢谢你的帮助。 –