【问题标题】:What is the best way to find all dates that match the date you entered?查找与您输入的日期匹配的所有日期的最佳方法是什么?
【发布时间】:2020-01-24 16:27:05
【问题描述】:

我正在尝试在相应日期之前使用 SQL Developer 从 Oracle DB 中获取所有结果。

我的数据:

ID         | date_time_of_identification
--------------------------------------------
1240088696 | 22-SEP-19 06.24.23.432000000 AM
1239485087 | 21-SEP-19 09.25.45.912000000 AM
1239228398 | 21-SEP-19 07.18.40.555000000 AM
1239223300 | 21-SEP-19 07.16.39.812000000 AM
1233224199 | 18-SEP-19 10.54.04.023000000 AM
1232432331 | 18-SEP-19 05.06.40.383000000 AM
1231492850 | 17-SEP-19 01.06.05.316000000 PM

所以我试图从 21.09.2019 获取所有行,然后我正在写:

select * from mytable where date_time_of_identification = TO_DATE('2019/09/21', 'yyyy/mm/dd'); -- no result

现在我正在尝试编写更好的查询:

select * from mytable 
where to_char(date_time_of_identification, 'yyyy/mm/dd') = to_char(TO_DATE('2019/09/21', 'yyyy/mm/dd'), 'yyyy/mm/dd'); 

它返回了很好的结果,但是有更好的解决方案吗?

【问题讨论】:

    标签: sql oracle type-conversion


    【解决方案1】:

    您必须从列中截断日期以丢失时间戳部分:

     select * 
       from mytable 
      where trunc(date_time_of_identification) = TO_DATE('2019/09/21', 'yyyy/mm/dd');
    

    【讨论】:

      【解决方案2】:

      假设您的谓词具有合理的选择性(即特定日期的行数是表中行数的一小部分),您通常希望您的查询能够在 @ 上使用索引987654321@。如果将函数应用于该列,您将无法使用索引。所以你通常想把它写成

      select *
        from myTable
       where date_time_of_identification >= date '2019-09-21'
         and date_time_of_identification <  date '2019-09-22'
      

      另一种方法是在date_time_of_identification 上创建一个基于函数的索引,然后在查询中使用该函数。

      create index fbi_myTable
          on trunc( date_time_of_identification );
      
      select *
        from myTable
       where trunc( date_time_of_identification ) = date '2019-09-21';
      

      【讨论】:

        猜你喜欢
        • 2016-11-11
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多