1

在我的查询中,我目前有用户输入日期时间。

当前查询

where TableT.STARTDATETIME  >= To_Date('?DATE1?','MM-DD-YYYY HH24:MI:SS')
          and TableT.STARTDATETIME <= To_Date('?DATE2?','MM-DD-YYYY HH24:MI:SS') 

用户将为 Date1 输入
10-02-2013 00:00:00
对于 Date2:10-02-2013 23:59:59

参数:- ?DATE?&DATE2只是用户输入日期的参数。

需要
如何让sql自动输入从00:00:00to开始的昨天日期23:59:59

我知道我可以使用类似sysdate-1但不确定的东西。

4

2 回答 2

4

你可以使用

TRUNC(TableT.STARTDATETIME) = TRUNC(sysdate-1)

为此,将两个日期截断为支票两侧的日期。但是,为了提高效率,您需要一个函数索引 on TRUNC(TableT.STARTDATETIME)

从性能方面可能总体上更好:

TableT.STARTDATETIME >= trunc(sysdate-1) AND TableT.STARTDATETIME < trunc(sysdate);

这包括昨天的 00:00:00 (the >=),但不包括今天的 00:00:00 (the <)。

警告!请记住,对于TIMESTAMP列 - 虽然由于其简单性而很诱人 -不要用作23:59:59结束时间,因为之间的 1 秒时间段23:59:5900:00:00可能包含数据 - 这种差距将使它们无法处理......

于 2013-10-03T16:09:55.770 回答
4

这将是:

where TableT.STARTDATETIME >= trunc(sysdate-1) and
      TableT.STARTDATETIME <  trunc(sysdate)

避免截断列值本身——尽管您可以在 Trunc(TableT.STARTDATETIME) 上放置一个索引,但您需要另一个索引来支持基于时间的查询,这是一种隐藏优化器中值分布的好方法。

在此处查看有关日期和时间戳算术的更多信息,并在Trunc (datetime, format)函数中查看其他有用的操作日期的方法。

于 2013-10-03T16:10:32.260 回答