gpt4 book ai didi

sql - Oracle日期 "Between"查询

转载 作者:行者123 更新时间:2023-12-03 06:01:40 24 4
gpt4 key购买 nike

我使用的是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”和“%”。但我不知道在哪里使用它们。请对此进行一些说明。

最佳答案

从您的输出来看,您似乎已将 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 将默认它为午夜。这对于 BETWEENfrom 侧来说没问题,但对于 until 侧则不然:

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 树索引的资格。您需要构建一个基于函数的索引。

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

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')

关于sql - Oracle日期 "Between"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com