甲骨文解码空日期变量
我有一个查询作为一个较大的功能的一部分,并有麻烦使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
通常NULL
和DECODE
不起作用。任何想法/帮助解决这个问题,表示赞赏。
编辑 添加一些样本数据表明:
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;
SELECT EFFECTIVE_DATE, STOP_DATE from IDLS where IDL_SEQ = 2320;
DESC IDL_TABLE
DESC SCHEDULES
COMP_DATE = datRunDate
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
我会这样写:
COALESCE(datRunDate, SYSDATE) BETWEEN COALESCE(EFFECTIVE_DATE, datRunDate, SYSDATE - 1) AND
COALESCE(STOP_DATE + (59/86400), dateRunDate, SYSDATE + 1)
ANSI标准功能COALESCE()
比使用NVL()
和DECODE()
(无论如何应该被废弃)更简单。
谢谢你,但它仍然不会为我返回任何东西。如果我将最后一个条件'COALESCE(STOP_DATE +(59/86400),dateRunDate,SYSDATE + 1)'改为'datRunDate'就可以正常工作。 –
@random_answer_guy。 。 。我很确定你的代码中的逻辑是在这个答案中实现的。我不能说基于未知要求的逻辑*应该是什么。 –
这是正确的答案,我有另一个问题,使得它似乎失败了,谢谢你的帮助。 –
您确定您的日期字段中没有“默认”值吗?即使空日期,解码似乎也能正常工作;例如,这会给出sysdate:'双重'select decode(null,null,sysdate,sysdate-100)' – Aleksej
'datRunDate'和'EFFECTIVE_DATE'中的所有值都是日期。 –
他们是日期,好的,但有可能你有,例如,01/01/0001而不是null? – Aleksej