我如何 运行 一次具有不同值的单个查询?

How can I run a single query with different values at once?

我有以下查询,每次都需要更新日期和时间。任何人都可以帮助我找出可以 运行 单个查询并可以提取多个输入结果的方法吗?

select channel
       ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy')
       , count(1) count 
from emcdu.ext_contract_history ech 
where ch_status='a' 
and CH_VALIDFROM BETWEEN TO_DATE('17/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss') 
                 AND TO_DATE ('17/10/2018 21:16:00','dd/mm/yyyy hh24:mi:ss') 
and ch_validfrom=(select min(CH_VALIDFROM) 
                  from emcdu.ext_contract_history 
                  where co_id=ech.co_id 
                  and ch_status='a') 
group by channel
       , TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy');

我有以下日期和时间值:

('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE
('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss')

('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss')  AND TO_DATE 
('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss') 

('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss')   AND TO_DATE
('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')

根据我从您的评论中了解到的情况,您可能希望为每个范围定义一个范围 ID 并将其包含在 group by 中,然后将这些范围放入 CTE(或范围 table )

with inputs
AS
(
SELECT 1 in_range_id,
       TO_DATE('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') as start_dtime,
       TO_DATE('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss') as end_dtime

FROM dual
UNION ALL
SELECT 2,
       TO_DATE('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss'),
       TO_DATE('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss')
FROM dual
UNION ALL
SELECT 3,
       TO_DATE('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss'),
       TO_DATE('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')
FROM dual
)
select in_range_id
       ,channel
       ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy')
       , count(1) count 
from emcdu.ext_contract_history ech cross join inputs i
where ch_status='a' 
and ch_validfrom BETWEEN  i.start_dtime 
                     AND  i.end_dtime
and ch_validfrom=(select min(CH_VALIDFROM) 
                  from emcdu.ext_contract_history 
                  where co_id=ech.co_id 
                  and ch_status='a') 
group by in_range_id
         ,channel
         ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy');

一点点 ORing 怎么样(即将这些条件放入同一个 WHERE 子句中,使用 OR 运算符):

select   channel
       , to_char(ech.ch_validfrom, 'dd/mm/yyyy')
       , count(*) count 
from emcdu.ext_contract_history ech 
where ch_status = 'a' 
and (   ch_validfrom between to_date('17/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss') 
                         and to_date('17/10/2018 21:16:00','dd/mm/yyyy hh24:mi:ss') 
     or ch_validfrom between to_date('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') 
                         and to_date('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss')
     or ch_validfrom between to_date('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss')  
                         and to_date('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss') 
     or ch_validfrom between to_date('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss')   
                         and to_date('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')
    )
and ch_validfrom=(select min(ch_validfrom) 
                  from emcdu.ext_contract_history 
                  where co_id = ech.co_id 
                  and ch_status = 'a') 
group by channel
       , to_char(ech.ch_validfrom, 'dd/mm/yyyy');