枚举两个日期、月份或者年份之间的所有日期、月份或者年份

       最近在一个需求当中,需要枚举出两个不同类型的时间周期(日期、月份和年份)之间的所有周期,比如2011-01-01和2011-01-04,则要获取日期2011-01-01、2011-01-02、2011-01-03和2011-01-04。这里将日期、月份、年份统称为周期。此需求所属系统使用的是ORACLE10g

        既然是求区间的所有周期,则可以考虑使用递增一个原子周期获得,日期可以直接使用符号“+”即可实现,而月份,则可以使用ADD_MONTHS函数,递增需要知道递增的范围,而这个范围即是两个周期之间的间隔周期数。

        联想到ORACLE本身就有方法可以计算出两个日期和月份之间间隔的天数或月数,日期:通过两个日期直接相减,如 TO_DATE('2011-05-17', 'YYYY-MM-DD') -TO_DATE('2011-05-01', 'YYYY-MM-DD')即可获取相隔天数,而月份则可以使用函数 MONTHS_BETWEEN(TO_DATE('2012-02', 'YYYY-MM'),TO_DATE('2011-05', 'YYYY-MM'))获取间隔的月份,如果两个参数的格式为具体的日期,则返回带小数。

       得到间隔周期数,便可以使用connect by来实现递归,一个好的办法就是使DUAL中的ROWNUM在规定的范围内递增,最终的SQL语句如下:

       日期:

       SELECT TO_CHAR(TRUNC(TO_DATE('2011-05-01', 'YYYY-MM-DD')) + ROWNUM - 1,'YYYY-MM-DD') YWDATE FROM DUALCONNECT BY ROWNUM - 1 <= TO_DATE('2011-05-17', 'YYYY-MM-DD')-TO_DATE('2011-05-01', 'YYYY-MM-DD')

      月份:

      SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2011-05', 'YYYY-MM'), ROWNUM - 1),'YYYY-MM') YWDATE FROM DUALCONNECT BY ROWNUM - 1 <=MONTHS_BETWEEN(TO_DATE('2012-02', 'YYYY-MM'),TO_DATE('2011-05', 'YYYY-MM'))

      至于年份,你懂的,不说了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差点成功人士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值