之间不包括oracle中的结束日期

时间:2015-04-02 06:06:37

标签: oracle

我正在写这样的查询 select * from tablename where date between '27-mar-2015' and '1-apr-2015'

但未从oracle数据库日期类型'1-apr-2015'检索到日期为TIMESTAMP(6)的记录。

5 个答案:

答案 0 :(得分:2)

  

在2015年3月27日之间'和' 1-apr-2015'

' 27-MAR-2015'不是日期,它是一个字符串文字。您正在强制Oracle进行隐式数据类型转换。

  

日期类型是TIMESTAMP(6)

由于您的数据类型是 TIMESTAMP ,因此您需要处理TIMESTAMP数据类型的精度,该数据类型将小数秒保持在0到9位小数之间的精度,默认值为6。

BETWEEN 
   to_timestamp('27-mar-2015 01.01.01.000001','dd-mon-yyyy HH24:MI:SS.FF') 
AND
   to_timestamp('01-apr-2015 23.59.59.999999','dd-mon-yyyy HH24:MI:SS.FF')

例如,

SQL> ALTER SESSION SET nls_timestamp_tz_format = 'DD-MON-YYYY HH24:MI:SS.FF';

Session altered.

SQL> SELECT
  2    to_timestamp('27-mar-2015 01.01.01.000001','dd-mon-yyyy HH24:MI:SS.FF') st,
  3    to_timestamp('01-apr-2015 23.59.59.999999','dd-mon-yyyy HH24:MI:SS.FF') end
  4  FROM dual
  5  /

ST                                    END
----------------------------------    ----------------------------------
27-MAR-15 01.01.01.000001000 AM       01-APR-15 11.59.59.999999000 PM

SQL>

答案 1 :(得分:1)

您必须注意timestamp - 列(以及oracle甚至date - 列)始终包含时间,而date '1-apr-2015'实际上意味着'1-apr-2015 00:00:00' - 然后一切都有道理。时间戳的确切字符串表示可能会根据配置的区域设置而有所不同。

要获得包括4月1日的日期,如果您不介意包含当天的第一个微秒,那么最好使用between ... and '2-apr-2015'

答案 2 :(得分:0)

尝试转换为to_date:

select * from tablename 
where date  between to_Date('27-mar-2015','dd-mm-yyy') 
and to_date('1-apr-2015','dd-mm-yyyy')

答案 3 :(得分:0)

我遇到了同样的问题。使用 TRUNC 日期函数有所帮助。

select * from tablename where trunc(date,'DAY') between '27-mar-2015' and '1-apr-2015'

答案 4 :(得分:-1)

尝试使用此代码:

select * from tablename where to_date(date,'DD-MON-YYYY')  between '27-mar-2015' and '1-apr-2015'.