【问题标题】:Oracle: range between datesOracle:日期之间的范围
【发布时间】:2013-11-19 14:04:52
【问题描述】:

我的帐户表包含以下数据:

T_ID    T_RESTDATE  T_RESTSUM   T_INCOME    T_OUTCOME   
1135782 20.04.2013  16714,31    16714,31    0
1135782 20.05.2013  33362,4     16648,09    0
1135782 20.06.2013  49179,59    15817,19    0
1135782 20.07.2013  64207,42    15027,83    0
1135782 20.08.2013  78485,35    14277,93    0
1135782 20.09.2013  92050,89    13565,54    0
1135782 20.10.2013  104939,65   12888,76    0

要生成日期之间的范围,我通常使用以下查询:

SELECT :dateBeg+level-1 turndate
FROM dual
  CONNECT BY level <= :dateEnd-:dateBeg+1 

我如何得到以下结果:

T_ID    T_RESTDATE  T_RESTSUM   T_INCOME    T_OUTCOME   
1135782 20.04.2013  16714,31    16714,31    0
1135782 21.04.2013  16714,31    16714,31    0
1135782 22.04.2013  16714,31    16714,31    0
1135782 23.04.2013  16714,31    16714,31    0
...
1135782 20.05.2013  33362,4     16648,09    0
1135782 21.05.2013  33362,4     16648,09    0
1135782 22.05.2013  33362,4     16648,09    0
...

【问题讨论】:

  • 您想在 T_RESTDATE asc 之前订购吗?
  • 不需要订购

标签: oracle date range


【解决方案1】:

您可以生成一组从最小值到最大值的日期,然后将其与您的表外部连接。 然后,使用 LAST_VALUE 函数填充空值。

SQL Fiddle

create table mytab(
    t_id number,
    t_restdate date,
    t_restsum varchar2(20)
    );

insert into mytab values(1135782, date'2013-04-20', '16714,31'); 
insert into mytab values(1135782, date'2013-05-20', '33362,4');  
insert into mytab values(1135782, date'2013-06-20', '49179,59'); 

查询 1

with x(min_date, max_date) as (
  select min(t_restdate), max(t_restdate)
  from mytab
  ),
y(all_date) as (
  select min_date + level - 1
  from x
  connect by min_date + level - 1 <= max_date
  )
select last_value(mytab.t_id) ignore nulls over (order by y.all_date),
       y.all_date,
       last_value(mytab.t_restsum) ignore nulls over (order by y.all_date)
from y left outer join mytab
on y.all_date = mytab.t_restdate
order by y.all_date;

Results

【讨论】:

    【解决方案2】:

    这里有两种方法。

    一种不好的方式(但有时需要):

        select *
    from   TABLE_NAME
    where  TABLE_NAME.DATE in (select :DATEBEG + level - 1 TURNDATE
                               from   DUAL
                               connect by level <= :DATEEND - :DATEBEG + 1)
    order  by TABLE_NAME.DATE asc;
    

    一个好办法:

    select *
    from   TABLE_NAME
    where  TRUNC(TABLE_NAME.DATE) between TRUNC(TO_DATE(:DATEBEG)) and TRUNC(TO_DATE(:DATEEND))
    order  by TABLE_NAME.DATE asc;
    

    【讨论】:

    • 但我没有 :DATEEND 和 :DATEBEG。此日期在休息表中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2017-12-20
    • 1970-01-01
    • 2020-07-01
    相关资源
    最近更新 更多