Oracle日期"之间"查询

Gna*_*air 51 sql oracle oracle10g where-clause date-arithmetic

我正在使用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'
Run Code Online (Sandbox Code Playgroud)

但是我从上面的查询中得不到任何结果.我想我必须使用"喜欢"和"%".但我不知道在哪里使用它们.请点亮这个.

提前致谢.

APC*_*APC 83

从您的输出判断,您似乎已将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> 
Run Code Online (Sandbox Code Playgroud)

但我们仍然只得到一排.这是因为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>
Run Code Online (Sandbox Code Playgroud)

编辑

如果您无法传递时间组件,则有几个选择.一种是更改WHERE子句以从条件中删除时间元素:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')
Run Code Online (Sandbox Code Playgroud)

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

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

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 
Run Code Online (Sandbox Code Playgroud)

由于这些问题,许多人宁愿between通过检查日期边界来避免使用这样的问题:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')
Run Code Online (Sandbox Code Playgroud)


Cha*_*rch 22

你需要将它们转换为实际日期而不是字符串,试试这个:

SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('2010-01-15','YYYY-MM-DD') AND TO_DATE('2010-01-17', 'YYYY-MM-DD');
Run Code Online (Sandbox Code Playgroud)

编辑处理指定的格式:

SELECT *
FROM <TABLENAME>
WHERE start_date BETWEEN TO_DATE('15-JAN-10','DD-MON-YY') AND TO_DATE('17-JAN-10','DD-MON-YY');
Run Code Online (Sandbox Code Playgroud)