以下是查询:
SELECT XALDV.EMPLOYEE_NUMBER,
TO_CHAR (XALDV.HIRE_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
XALDV.HOLDER_NAME,
XALDV.BUSINESS_LINE1,
TO_CHAR (XALDV.ISSUE_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
XALDV.LICENSE_DESCRIPTION,
XALDV.BUSINESS_LINE2,
XALDV.LICENSE_NO,
XALDV.BUSINESS_LINE3,
XALDV.BUSINESS_LINE4,
XALDV.LICENSE_TITLE,
XALDV.BUSINESS_LINE5,
XALDV.LICENSE_TYPE,
XALDV.LIC_AUTHORITY_NAME,
XALDV.LIC_CATEGORY_NAME,
XALDV.LIC_HOLDER_TYPE,
XALDV.LIC_PROJECT_NAME,
XALDV.LIC_REGION_NAME,
XALDV.LIC_STATUS_NAME,
XALDV.LOA_STATUS,
XALDV.MASTEC_ORG,
TO_CHAR (XALDV.RENEWAL_DATE ,'YYYY/MM/DD HH:MI:SS AM'),
XALDV.STATE details ,
null publish_cols
FROM APPS.XXMTZ_AT_LIC_DTL_V XALDV
WHERE 1=1
AND '05-JAN-2019' BETWEEN issue_date AND NVL(RENEWAL_DATE,SYSDATE)
一个特定行没有出现的问题是由于Renewal_date中的值为空。
我已经尝试使用示例代码中的NVL,但是没有得到那一行。
请帮我做什么?
答案 0 :(得分:2)
该特定记录的issue_date也具有空值。
您正在运行以下查询
select 1
from dual
where '05-JAN-2019' between NULL and NVL(NULL, sysdate)
您不能期望上面的记录返回任何记录,因为05-JAN-2019
不在NULL
和任何值之间。它甚至都不会作为日期进行比较,因为要比较的值之一是NULL
。
但是,如果您运行以下查询,它将为您提供一条记录,因为现在您已经添加了NVL条件来处理NULL。
select 1
from dual
where date '2019-01-01' between NVL(NULL,'01-jan-1950') and NVL(null, sysdate)
您需要根据期望查询返回的值来决定查询的解决方案
WHERE 1=1
AND '05-JAN-2019' BETWEEN NVL(issue_date,'05-JAN-2019') AND NVL(RENEWAL_DATE,SYSDATE)
答案 1 :(得分:0)
请勿在日期中使用BETWEEN
!这对于Oracle尤其重要,在Oracle中,DATE
数据类型具有时间分量-无论您是否看到它。
所以,我建议:
( (issue_date IS NULL OR issue_date >= DATE '2019-01-05') AND
(renewal_date IS NULL OR renewal_date < sysdate)
)