Oracle时间比较与sysdate问题

时间:2016-03-10 14:02:53

标签: sql oracle

我在准确的日期获取有关过滤的数据时遇到问题。

当我运行以下查询时,我得到的结果

select * from table d
where D.TIME_STAMP >=  SYSDATE -39

Return 36789 Rows

当我尝试获取一天的数据时,它会运行0行。我已经检查过表格,我有特别需要日期的数据,但是我的查询没有返回任何行。 当我运行以下查询

select * from table d
where D.TIME_STAMP =  SYSDATE -39

Return 0 Rows.

我正在使用Oracle 11g,我的表已经有字段名table_stamp,需要日期数据。 TIME_STAMP的数据类型NOT NULL DATE

2 个答案:

答案 0 :(得分:2)

如果您的TIME_STAMP列没有时间组件(即时间组件为00:00:00),那么您可以使用以下方式进行比较:

SELECT *
FROM   table d
WHERE  D.TIME_STAMP =  TRUNC( SYSDATE ) - 39;

如果该列有时间组件,并且您尝试获取39天前的所有行,那么您可以使用:

SELECT *
FROM   table d
WHERE  TRUNC( D.TIME_STAMP ) =  TRUNC( SYSDATE ) - 39;

但是,这意味着您无法在TIME_STAMP列上使用索引(但可以在TRUNC( TIME_STAMP )上使用基于函数的索引)。

这可以通过使用:

来解决
SELECT *
FROM   table d
WHERE  D.TIME_STAMP >=  TRUNC( SYSDATE ) - 39
AND    D.TIME_STAMP <   TRUNC( SYSDATE ) - 38;

答案 1 :(得分:1)

您应该使用TRUNC()从日期中删除时间:

select * from table d
where trunc(D.TIME_STAMP) =  trunc(SYSDATE -39)

我不知道你在TIME_STAMP中保留了什么格式,但即使它已经完成,sysdate会生成一个日期,其中包含计算机设置时间的时间。

编辑如果你不想使用trunc作为索引,请使用:

select * from table d
where D.TIME_STAMP >=  trunc(SYSDATE -39) 
  AND D.TIME_STAMP < trunc(SYSDATE -38)