我在准确的日期获取有关过滤的数据时遇到问题。
当我运行以下查询时,我得到的结果
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
答案 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)