暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将季度数转换为本季度月份的日期

askTom 2017-03-15
1023

问题描述

嗨,汤姆!

我有一个表,其中包含一年的四分之一 (1、2、3、4)。我想将每一行乘以另一个表,同时用两列替换四分之一列-依次包含每个季度的3个月中的每一个的第一天和最后一天的日期。例如,四分之一 = 1的每一行产生3行,字段值如下:
FIRST------------LAST
'01.01.2017 ','31.01.2017'
'01.02.2017 ','28.01.2017'
'01.03.2017 ','31.03.2017'

等等。

我是怎么做的?

提前谢谢。

专家解答

您可以使用add_months以月数递增日期。因此,您只需要计算要添加的月份数。

如果你有一个行/四分之一,交叉加入这个三行表。然后找到每个月的开始,你:

-从四分之一中减去1,然后乘以3。然后加上 “季度内的月份”-1

每个的结束日期都是相似的,但是你不需要从 “季度内的月份” 中减去一个。只是从add_months的结果减去一天:

with rws as (
  select 2017 yr, 1 qtr from dual union all
  select 2017 yr, 2 qtr from dual union all
  select 2017 yr, 3 qtr from dual union all
  select 2017 yr, 4 qtr from dual
), qmths as (
  select level-1 q from dual connect by level <= 3
)
  select yr, qtr,
         add_months(to_date('01-01-' || yr, 'dd-mm-yyyy'), ((qtr-1) * 3) + q ) st,
         add_months(to_date('01-01-' || yr, 'dd-mm-yyyy'), ((qtr-1) * 3) + q + 1 )-1 en
  from   rws
  cross  join qmths
  order  by st;

YR     QTR  ST                    EN                    
2,017  1    01-JAN-2017 00:00:00  31-JAN-2017 00:00:00  
2,017  1    01-FEB-2017 00:00:00  28-FEB-2017 00:00:00  
2,017  1    01-MAR-2017 00:00:00  31-MAR-2017 00:00:00  
2,017  2    01-APR-2017 00:00:00  30-APR-2017 00:00:00  
2,017  2    01-MAY-2017 00:00:00  31-MAY-2017 00:00:00  
2,017  2    01-JUN-2017 00:00:00  30-JUN-2017 00:00:00  
2,017  3    01-JUL-2017 00:00:00  31-JUL-2017 00:00:00  
2,017  3    01-AUG-2017 00:00:00  31-AUG-2017 00:00:00  
2,017  3    01-SEP-2017 00:00:00  30-SEP-2017 00:00:00  
2,017  4    01-OCT-2017 00:00:00  31-OCT-2017 00:00:00  
2,017  4    01-NOV-2017 00:00:00  30-NOV-2017 00:00:00  
2,017  4    01-DEC-2017 00:00:00  31-DEC-2017 00:00:00 
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论