在Oracle中使用“Interval”,其中“Interval”是表中的值

时间:2014-03-07 18:16:12

标签: sql oracle date intervals

我需要使用以下数据列在Oracle DB中生成值列表:

ITEM_TYPE             VARCHAR2(20)
ITEM_LAST_UPDATED     DATE
ITEM_UPDATE_TOLERANCE NUMBER(1)

应该发送到控制台的唯一数据是日期为'ITEM_LAST_UPDATED'小于sysdate的项目减去'ITEM_UPDATE_TOLERANCE'中的整数值。

所以,如果我想展示一小时过去的那些,我可以这样做:

select ITEM_TYPE from MY_TABLE
where
to_char(ITEM_LAST_UPDATED, 'DD-MON-YYYY HH24:MI')
<=
to_char(sysdate - interval '1' hour, 'DD-MON-YYYY HH24:MI');

但是,我不需要在上面的语句中使用“1”,而是需要将其替换为ITEM_UPDATE_TOLERANCE的数值。

我尝试了几个不同的版本,但所有错误(例如):

select ITEM_TYPE from MY_TABLE
where
to_char(ITEM_LAST_UPDATED, 'DD-MON-YYYY HH24:MI')
<=
to_char(sysdate - interval to_number(ITEM_UPDATE_TOLERANCE) hour, 'DD-MON-YYYY HH24:MI');

3 个答案:

答案 0 :(得分:8)

为什么要将完美的DATE列转换为字符值,只是为了将其转换为字符列的另一个DATE值进行比较。

只需使用:

ITEM_LAST_UPDATED <= sysdate - interval '1' hour

要实现您想要的效果,只需乘以值:

ITEM_LAST_UPDATED <= sysdate - (interval '1' hour) * ITEM_UPDATE_TOLERANCE

也绝对不需要使用to_number()函数将数字转换为数字。

答案 1 :(得分:7)

作为@ a_horse_with_no_name的间隔乘法技巧或San的除法方法的替代方法,您还可以使用numtodsinterval() function

ITEM_LAST_UPDATED <= sysdate - numtodsinterval(ITEM_UPDATE_TOLERANCE, 'HOUR')

举个例子:

select sysdate, sysdate - numtodsinterval(3, 'HOUR') from dual;

SYSDATE             SYSDATE-NUMTODSINTE
------------------- -------------------
2014-03-07 19:08:27 2014-03-07 16:08:27

答案 2 :(得分:2)

您可以尝试使用简单的计算

select ITEM_TYPE from MY_TABLE
where
ITEM_LAST_UPDATED
<=
sysdate - (ITEM_UPDATE_TOLERANCE/24);

ITEM_UPDATE_TOLERANCE/24的计算会将小时数转换为天数,然后可以从sysdate中减去。