我需要使用以下数据列在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');
a_horse_with.. 8
为什么要将完美DATE
列转换为字符值,只是为了将其DATE
转换为字符列的另一个值进行比较.
只需使用:
ITEM_LAST_UPDATED <= sysdate - interval '1' hour
要实现您想要的,只需乘以该值:
ITEM_LAST_UPDATED <= sysdate - (interval '1' hour) * ITEM_UPDATE_TOLERANCE
使用该to_number()
功能也绝对不需要将数字转换为数字.
为什么要将完美DATE
列转换为字符值,只是为了将其DATE
转换为字符列的另一个值进行比较.
只需使用:
ITEM_LAST_UPDATED <= sysdate - interval '1' hour
要实现您想要的,只需乘以该值:
ITEM_LAST_UPDATED <= sysdate - (interval '1' hour) * ITEM_UPDATE_TOLERANCE
使用该to_number()
功能也绝对不需要将数字转换为数字.
作为@ a_horse_with_no_name的间隔乘法技巧或San的除法方法的替代,您还可以使用以下numtodsinterval()
函数:
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