如何在oracle中每年添加缺少的月份

时间:2017-09-06 12:39:16

标签: sql oracle

这是我的查询

的输出

image

但我需要2016年和2017年的所有月份的输出方式

01-2017,02-2017,03-2017,04-2017,05-2017,06-2017,07-2017,08-2017,09-2017,10-2017,11-2017,12-2017 ,01-2016,01-2016,01-2016,02-2016,03-2016,04-2016,05-2016,06-2016,07-2016,08-2016,09-2016,10-2016,11 -2016,12-2016]

我的查询是:

SELECT DISTINCT
    to_char(to_date(checked_date, 'dd-mon-yy'), 'mm-yyyy') AS month
FROM DOCTOR_CHECKUP;

下图显示了我的查询输出,但我需要2016年和2017年的所有月份输出均为01-2017,02-2017,03-2017,04-2017,05-2017,06-2017, 07-2017,08-2017,09-2017,10-2017,11-2017,12-2017,01-2016,01-2016,01-2016,02-2016,03-2016,04-2016,05- 2016,06-2016,07-2016,08-2016,09-2016,10-2016,11-2016,12-2016

4 个答案:

答案 0 :(得分:1)

此查询生成24个“月”值:

select to_char(add_months(date '2016-01-01', level - 1), 'mm-yyyy') mth 
  from dual 
  connect by level <= 24

......这是基本答案。如果您想找到缺失的月份,您可以minus此查询和您的查询:

select to_char(add_months(date '2016-01-01', level - 1), 'mm-yyyy') mth 
  from dual connect by level <= 24
minus
select to_char(to_date(checked_date, 'dd-mon-yy'), 'mm-yyyy')
  from doctor_checkup

与David Faber answer类似,我添加了add_months,第二部分回答了这个问题。

看起来checked_date是varchar类型,你应该避免以这种格式存储日期。

答案 1 :(得分:0)

这很简单。显然,当您只想选择从'01-2016''12-2017'的月份时,您甚至不需要该表:

select '01-2016' as month from dual
union all
select '02-2016' as month from dual
union all
...
union all
select '12-2017' as month from dual

答案 2 :(得分:0)

使用派生表或固定日期表(更推荐),如下所示:

SELECT DISTINCT NVL(t.month_col,s.month) as month_col
FROM(
    SELECT '01-2016' as month_col FROM DUAL
    UNION ALL
    SELECT '02-2016' as month_col FROM DUAL
    UNION ALL 
    .... // all the dates you want
     ) t
LEFT JOIN YourTable s

虽然这里似乎没必要,但如果您没有使用表中的任何额外信息,只需使用t别名的内部查询。

答案 3 :(得分:0)

使用Ponder Stibbons提供的查询

select to_char(add_months(date '2016-01-01', level - 1), 'mm-yyyy') mth 
  from dual 
  connect by level <= 24

然后你可以将它加入到你的桌子中,以获得与doctor_checkup相关的任何必要的统计数据。请注意,联接应该在&#34; doctor_checkup&#34;中的checked_date的月份。您可能想要创建基于函数的索引:to_char(checked_date,&#39; mm-yyyy&#39;)

例如,要获得每月的约会数

select mth, nvl(count(1), 0) appointments
from (select to_char(add_months(date '2016-01-01', level - 1), 'mm-yyyy') mth 
      from dual 
      connect by level <= 24) mo 
      left outer join doctor_checkup dc on mo.mth = to_char(dc.checked_date, 'mm-yyyy')