我有以下查询。
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。
答案 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日的任何时间值相匹配。