您的位置:首页 > 其它

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

2011-10-13 00:13 288 查看
最近在一个需求当中,需要枚举出两个不同类型的时间周期(日期、月份和年份)之间的所有周期,比如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'))

至于年份,你懂的,不说了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: