查询仅在要求的小时范围内生成数据

时间:2017-11-17 08:54:04

标签: sql oracle

Oracle SQL:

我一直试图让这个查询片段正常工作。当您运行它时,它会提示您一个小时,并且不显示任何记录。我不希望查询有一个静态小时,因为它需要每天运行4次。 因此,从'& date'输入,我希望它显示过去24小时的数据。这可能吗?

dt_time = timestamp(6) field

select distinct to_char(dt_ time,'dd/mm/yyyy hh24'), fault_description
from order
where to_char(dt_time,'hh24') <= '&date' -24
order by to_char(dt_ time,'dd/mm/yyyy hh24');

例如,如果输入10(执行查询时),它将在第二天显示从10(:00)到10(:00)的数据

[希望有足够的信息让某人回答,请]

4 个答案:

答案 0 :(得分:0)

使用betweeninterval的组合:

where dt_time between  
to_date(&date, 'ddmmyyyy hh24') and 
to_date(&date, 'ddmmyyyy hh24') + interval  '24' hour

您需要将输入日期作为完整日期传递/解析,而不仅仅是小时部分,以防止意外结果。

答案 1 :(得分:0)

您可以在CTE中使用NUMTODSINTERVAL来获取用户输入的小时数。

WITH t_hour( h ) AS
  ( SELECT NUMTODSINTERVAL(&d,'HOUR' ) h FROM DUAL
  )
SELECT DISTINCT TO_CHAR(dt_time,'dd/mm/yyyy hh24'),
  fault_description
FROM ORDER
CROSS JOIN t_hour
WHERE dt_time BETWEEN TRUNC(SYSDATE) + h AND TRUNC(SYSDATE) + 1 + h
ORDER BY 1;

答案 2 :(得分:0)

在获取最近一天的数据时,您需要使用SYSDATE。 此外,如果使用日期列添加或减去数字,则偏移量将是天数,而不是小时数。所以你需要使用&date/24

试试这个:

select distinct to_char(dt_time,'dd/mm/yyyy hh24'), fault_description
from order
where dt_time - &date / 24 between TRUNC(sysdate-1) and TRUNC(sysdate)   
order by to_char(dt_ time,'dd/mm/yyyy hh24');

请评论。

答案 3 :(得分:0)

WHERE DATEDIFF(SYSDATE,DT_TIME) * 24  < &DATE AND DT_TIME < SYSDATE