过滤日期不会返回正确的数据

时间:2015-09-17 13:06:08

标签: oracle10g

我有以下查询。

SELECT *
  FROM (SELECT temp.*, ROWNUM AS rn
          FROM (  SELECT (id) M_ID,
          CREATION_DATE,
                         RECIPIENT_STATUS,
                         PARENT_OR_CHILD,
                         CHILD_COUNT,
                         IS_PICKABLE,
                         IS_GOLDEN,
                         trxn_id,
                         id AS id,
                         MASTER_ID,
                         request_wf_state,
                         TITLE,
                         FIRST_NAME,
                         MIDDLE,
                         LAST_NAME,
                         FULL_NAME_LNF,
                         FULL_NAME_FNF,
                         NAME_OF_ORGANIZATION,
                         ADDRESS,
                         CITY,
                         STATE,
                         COUNTRY,
                         HCP_TYPE,
                         HCP_SUBTYPE,
                         is_edit_locked,
                         record_type rec_type,
                         DATA_SOURCE_NAME,
                         DEA_DATA,
                         NPI_DATA,
                         STATE_DATA,
                         RPPS,
                         SIREN_NUMBER,
                         FINESS,
                         ROW_NUMBER ()
                            OVER (PARTITION BY id ORDER BY full_name_fnf)
                            AS rp
                    FROM V_RECIPIENT_TRANS_SCRN_OP
                   WHERE 1 = 1
  AND creation_date  >= 
                       to_date( '01-Sep-2015', 'DD-MON-YYYY')   AND creation_date  <= 
                       to_date( '09-Sep-2015', 'DD-MON-YYYY')
                ORDER BY  CREATION_DATE DESC) temp
         WHERE rp = 1)
 WHERE rn > 0 AND rn < 10;

问题是,上面的查询确实返回了creation_date为'09 -Sep-2015'的数据。

我的数据库的NLS_DATE_FORMAT是'DD-MON-RR'。

列creation_date的数据类型是日期,存储日期的日期格式是MM / DD / YYYY。

1 个答案:

答案 0 :(得分:0)

由于您的列creation_date的值包含非零时间组件,而to_date( '09-Sep-2015', 'DD-MON-YYYY')的结果具有时间组件,因此谓词creation_date <= to_date( '09-Sep-2015', 'DD-MON-YYYY')为不太可能匹配。例如,&#34; 9/9/2015 1:07:45 AM&#34;显然大于&#34; 9/9/2015 0:00:00 AM&#34;,这是to_date()电话返回的。

您需要考虑Oracle DATE数据类型的时间组件。

一个选项是使用trunc()功能,从creation_date的值中删除时间组件。但是,这可能会阻止在creation_date上使用索引(如果存在)。

在我看来,更好的替代方案是将您的谓词重新定义为creation_date < to_date( '10-Sep-2015', 'DD-MON-YYYY'),这将与2015年9月9日的任何时间值相匹配。