对这种情况发生的原因感到困惑。我有一个查询,不包括我想要包含的记录。
有问题的记录包含以下值:
MEMBER_ID NAME_FIRST NAME_LAST START_DATE END_DATE PROGRAM_ID INDICATOR
-------------------- -------------------- ------------------------------ ---------- --------- ---------- -------------------------
M######## BOB JOHN 01-FEB-10 30-APR-14 M90 plan
(稍微更改了值以保持HIPPA合规性)。
所以结束日期显然是30-APR-14。
但是当我运行这个SQL时,记录不会回来:
SELECT
HNO.MEMBER_ID,
HNAME.NAME_FIRST,
HNAME.NAME_LAST,
HDATE.START_DATE,
HDATE.END_DATE,
HNAME.PROGRAM_ID,
HDATE.INDICATOR
FROM HCFA_NAME_ORG HNO
INNER JOIN NAME HNAME
ON HNO.NAME_ID = HNAME.NAME_ID
INNER JOIN HCFA_DATE HDATE
ON HNO.NAME_ID = HDATE.NAME_ID
WHERE INSTR(HNO.MEMBER_ID,'M',1,1)>0 AND
MEMBER_ID='M20012289' and INDICATOR='plan' AND
HDATE.START_DATE <= LAST_DAY(ADD_MONTHS(SYSDATE,-2)) AND
HNAME.PROGRAM_ID != 'XXX'
AND (HDATE.END_DATE IS NULL OR HDATE.END_DATE>=LAST_DAY(ADD_MONTHS(SYSDATE,-2)))
当我注释掉最后一行时,确实会回来:
这是为什么?值显然是= LAST_DAY(ADD_MONTHS(SYSDATE,-2))那么为什么会被排除?也许我不了解Oracle日期字段或如何正确查询它们。
答案 0 :(得分:2)
使用Trunc()函数截断与日期关联的时间。然后,只能根据您的要求比较日期。
答案 1 :(得分:0)
当cdummy回答时,需要使用TRUNC函数,这样只比较日期部分,忽略时间部分进行比较。
AND TRUNC(HDATE.START_DATE) <= TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2)))
AND HNAME.PROGRAM_ID != 'XXX'
AND (HDATE.END_DATE IS NULL OR TRUNC(HDATE.END_DATE) >= TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2))));
此外,您可以通过查询如下方式检查START_DATE和END_DATE的时间部分:
SELECT
TO_CHAR(HDATE.START_DATE, 'YYYY/MM/DD HH24:MI:SS'),
TO_CHAR(HDATE.END_DATE,, 'YYYY/MM/DD HH24:MI:SS')
FROM HCFA_NAME_ORG HNO
INNER JOIN NAME HNAME
ON HNO.NAME_ID = HNAME.NAME_ID
INNER JOIN HCFA_DATE HDATE
ON HNO.NAME_ID = HDATE.NAME_ID
WHERE INSTR(HNO.MEMBER_ID,'M',1,1) > 0
AND MEMBER_ID='M20012289'
AND INDICATOR='plan'
AND HNAME.PROGRAM_ID != 'XXX';
答案 2 :(得分:0)
最后一行看起来像:
AND (HDATE.END_DATE IS NULL OR HDATE.END_DATE>=LAST_DAY(ADD_MONTHS(SYSDATE,-2)))
30-APR-14-00.00:00 >= 30-JUN-14-09.xx:xx (it includes the time part),
因此它返回FALSE并且你没有得到记录。
截断时间部分使用TRUNC()函数:
AND (HDATE.END_DATE IS NULL OR HDATE.END_DATE>=TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE,-2))))
只是一个小小的提示,有31个月有几个月:))