【问题标题】:Filtering date does not return correct data过滤日期不返回正确的数据
【发布时间】:2015-09-17 21:54:24
【问题描述】:

我有以下问题。

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。

【问题讨论】:

  • creation_date 的时间分量是否不是 0 小时 0 分钟 0 秒?
  • 是的。 creation_date 列中存储的日期格式为“9/9/2015 1:07:45 AM”
  • 很明显“9/9/2015 1:07:45 AM”不小于或等于“9/9/2015 0:00:00 AM”,由@987654323返回@
  • 那么你有什么建议:)
  • @mustaccio 感谢您的通知。我使用了 trunc(creation_date) 而不是 creation_date,我得到了我想要的结果。再次感谢您的通知。

标签: oracle10g


【解决方案1】:

由于您的列creation_date 的值具有非零时间分量,而to_date( '09-Sep-2015', 'DD-MON-YYYY') 的结果具有 时间分量,谓词creation_date &lt;= 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 &lt; to_date( '10-Sep-2015', 'DD-MON-YYYY'),这将匹配 2015 年 9 月 9 日日期的任何时间值。

【讨论】:

    猜你喜欢
    • 2016-02-15
    • 1970-01-01
    • 2015-12-14
    • 2020-02-16
    • 1970-01-01
    • 2019-12-03
    • 2011-08-08
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多