需要帮助查询Oracle日期字段

时间:2014-06-30 16:03:21

标签: sql oracle

对这种情况发生的原因感到困惑。我有一个查询,不包括我想要包含的记录。

有问题的记录包含以下值:

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日期字段或如何正确查询它们。

3 个答案:

答案 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个月有几个月:))