【问题标题】:Unable to fetch the records on TO DATE Oracle无法获取 TO DATE Oracle 上的记录
【发布时间】:2020-06-05 10:59:37
【问题描述】:

数据库 - 表格

 PROD.APPLICATION 
Game ID    Generated Date

 1          Jan-01-1995
 2          Aug-19-2003
 3          Nov-04-2001
 4          Sep-26-2007
 5          Sep-26-2007
 6          Sep-26-2007
 7          Sep-19-2007
 8          Sep-19-2007
 9          Sep-19-2007
10          Jan-11-1985
11          MAY-19-2003
12          Sep-22-2007
13          Sep-22-2007

我运行了以下查询

SELECT *
FROM PROD.APPLICATION JOIN PROD.STATUS ON (PROD.STATUS_ID = REF_STATUS.STATUS_ID)  

AND PROD.APPLICATION.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.APPLICATION.GENERETED_DT <= to_date('2007-09-26', 'yyyy-MM-dd');

搜索从 2007 年 9 月 19 日到 2007 年 9 月 26 日的记录,即 8 条记录。

这导致显示 2007 年 9 月 19 日 znd 2007 年 9 月 22 日的唯一记录,即只有 5 条记录

Actual Output
Game ID    Generated Date
7 Sep-19-2007
8 Sep-19-2007
9 Sep-19-2007
12 Sep-22-2007
13 Sep-22-2007

如何生成搜索查询,以便我可以获得所有 8 条记录 - 即这些日期的记录

预期输出

 4 Sep-26-2007
 5 Sep-26-2007
 6 Sep-26-2007
 7 Sep-19-2007
 8 Sep-19-2007
 9 Sep-19-2007
12 Sep-22-2007
13 Sep-22-2007

试过

SELECT *
FROM PROD.APPLICATION JOIN PROD.STATUS ON (PROD.STATUS_ID = REF_STATUS.STATUS_ID)  

AND PROD.APPLICATION.GENERETED_DT >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
    PROD.APPLICATION.GENERETED_DT = to_date('2007-09-26', 'yyyy-MM-dd');

复活无记录

【问题讨论】:

    标签: sql oracle date datetime plsql


    【解决方案1】:

    这会截断 APPLICATION.GENERETED_DT 中的时间部分,然后将其与右侧的日期进行比较。

    
    SELECT *
    FROM PROD.APPLICATION JOIN PROD.STATUS ON (PROD.STATUS_ID = REF_STATUS.STATUS_ID)  
    AND trunc(PROD.APPLICATION.GENERETED_DT) >= to_date('2007-09-19', 'yyyy-MM-dd') AND     
        trunc(PROD.APPLICATION.GENERETED_DT) <= to_date('2007-09-26', 'yyyy-MM-dd');
    

    【讨论】:

      【解决方案2】:

      日期可能包含时间部分。这是 Oracle 中 date 数据类型的一部分,但在您查询时通常不会显示。

      更好的方法使用以下逻辑:

      SELECT *
      FROM PROD.APPLICATION A JOIN
           PROD.STATUS S
           ON A.STATUS_ID = S.STATUS_ID  
      WHERE A.GENERATED_DT >= DATE '2007-09-19' AND
            A.GENERATED_DT < DATE '2007-09-27';
      

      注意事项:

      • &lt; DATE '2007-09-27' 将包括前一天的所有日期时间。
      • DATE 关键字引入了格式为 YYYY-MM-DD 的日期常量。
      • 表别名使查询更易于编写和阅读。
      • 将条件移至WHERE 子句对查询没有影响,但此类过滤更常见于WHERE 子句中的INNER JOIN

      【讨论】:

      • 如果您输入的“结束日期”需要是一个变量,您也可以添加一个变量。 myEndDate + 1,或在 OP 的原始示例中:to_date('2007-09-26', 'yyyy-MM-dd') + 1 这会为日期类型添加一个完整的 24 小时日。
      猜你喜欢
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 2020-07-27
      相关资源
      最近更新 更多