Oracle 日期“Between”查询

新手上路,请多包涵

我正在使用 oracle 数据库。我想执行一个查询来检查两个日期之间的数据。

 NAME               START_DATE
-------------    -------------
Small Widget       15-JAN-10 04.25.32.000000 PM
Product 1          17-JAN-10 04.31.32.000000 PM

select * from <TABLENAME> where start_date
BETWEEN '15-JAN-10' AND '17-JAN-10'

但我没有从上面的查询中得到任何结果。我想我必须使用“like”和“%”。但我不知道在哪里使用它们。请在这点上点灯。

原文由 Gnaniyar Zubair 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

从您的输出来看,您似乎已将 START_DATE 定义为时间戳。如果它是一个常规日期,Oracle 将能够处理隐式转换。但是,您不需要将这些字符串显式转换为日期。

 SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000

SQL>

但我们仍然只得到一排。这是因为 START_DATE 有一个时间元素。如果我们不指定时间组件,Oracle 会将其默认为午夜。这对于 BETWEEN 端来说很好,但对于 直到 端则不然:

 SQL> select * from t23
  2  where start_date between to_date('15-JAN-10')
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

编辑

如果您不能传入时间组件,则有两种选择。一种是更改 WHERE 子句以从条件中删除时间元素:

 where trunc(start_date) between to_date('15-JAN-10')
                            and to_date('17-JAN-10')

这可能会对性能产生影响,因为它会在 START_DATE 取消任何 b-tree 索引的资格。您将需要构建一个基于函数的索引。

或者,您可以将时间元素添加到代码中的日期:

 where start_date between to_date('15-JAN-10')
                     and to_date('17-JAN-10') + (86399/86400)

由于这些问题,许多人更喜欢通过检查日期边界来避免使用 between

 where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')

原文由 APC 发布,翻译遵循 CC BY-SA 3.0 许可协议

也可以使用以下查询:

 select *
  from t23
 where trunc(start_date) between trunc(to_date('01/15/2010','mm/dd/yyyy')) and trunc(to_date('01/17/2010','mm/dd/yyyy'))

原文由 Ajay 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进