2015-09-17 3 views
0

У меня есть следующий запрос.Дата фильтрации не возвращает корректные данные

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".

Тип данных столбца create_date - это дата и формат даты, в котором хранится дата, - MM/DD/YYYY.

+0

Имеет ли 'creation_date' компонент времени, который не 0 часов 0 минут 0 секунд? – mustaccio

+0

Да, да. Формат даты, хранящейся в столбце create_date, «9/9/2015 1:07:45 AM» –

+0

Так ясно «9/9/2015 1:07:45 AM» не менее или равно «9/9/2015 0:00:00 AM ", который возвращается' to_date ('09 -Sep-2015 ',' DD-MON-YYYY ') ' – mustaccio

ответ

0

Поскольку ваша колонка creation_date имеет значение с ненулевыми компонентами времени, а результат to_date('09-Sep-2015', 'DD-MON-YYYY') имеет временную составляющую нулевой, предикат creation_date <= to_date('09-Sep-2015', 'DD-MON-YYYY') вряд ли будет соответствовать. Например, «9/9/2015 1:07:45 AM» явно больше, чем «9/9/2015 0:00:00 AM», который возвращается вашим звонком to_date().

Вам нужно будет учитывать компонент времени для типа данных Oracle DATE.

Один из вариантов заключается в использовании функции trunc(), как и вы, для удаления компонента времени из значений creation_date. Однако это может помешать использованию индекса на creation_date, если он существует.

Лучшей альтернативой, на мой взгляд, было бы переформулировать ваш предикат как creation_date < to_date('10-Sep-2015', 'DD-MON-YYYY'), который будет соответствовать любым значениям времени в дату 09 сентября 2015 года.

Смежные вопросы