0

我有一个包含 3 列的表,其中包括一个名为的时间戳startson

事件(eventid编号、名称varchar2、startson时间戳)

我有一个变量,它是一个偏移量,表示startson我的 where 子句中的边界应该是什么。

例如:

if my_var = 0 (select events that started in the last 10 days)
if my_var = 1 (select events that started 20 days ago up until 10 days ago)
if my_var = 2 (select events that started 30 days ago up until 20 days ago)
if my_var = 3 (select events that started 40 days ago up until 30 days ago)
.. and so on

这是我尝试过的:

select * 
from events 
where startson >= (sysdate-(10*my_var)) 
and startson <= (sysdate-(10*my_var+10)) 
order by startson asc

即使我知道过去 10 天内有数百行开始,这也不会返回任何行。

4

2 回答 2

3

在这里,您的乘号后面有一个减号。

(sysdate-(10*-my_var)) 

在你的情况下,你最终会得到类似的东西

(sysdate -(10 * -1)) that will give you (sysdate + 10 days)

也许你应该有更多类似的东西

(sysdate-(10*my_var))

你应该反转“<=”和“>=”条件

where startson <= (sysdate-(10*my_var)) 
and startson >= (sysdate-(10*my_var+10)) 
于 2013-05-01T12:19:16.227 回答
0

如果我正确理解了问题,这是基本公式:

-- between last 10 days --
WHERE startson BETWEEN trunc(SYSDATE) AND (trunc(SYSDATE) - INTERVAL '10' DAY) 

要在一次选择中获取所有间隔:

SELECT start_date, ten_days_ago, twenty_days_ago, thirty_days_ago, fourty_days_ago
  FROM
(
 SELECT trunc(SYSDATE) start_date
     , (trunc(SYSDATE) - INTERVAL '10' DAY) ten_days_ago
     , (trunc(SYSDATE) - INTERVAL '20' DAY) twenty_days_ago
     , (trunc(SYSDATE) - INTERVAL '30' DAY) thirty_days_ago
     , (trunc(SYSDATE) - INTERVAL '40' DAY) fourty_days_ago
  FROM dual
)
--WHERE your_column BETWEEN twenty_days_ago AND ten_days_ago
/
于 2013-05-01T13:45:51.457 回答