枚举两个日期、月份或者年份之间的所有日期、月份或者年份
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'))
至于年份,你懂的,不说了。
既然是求区间的所有周期,则可以考虑使用递增一个原子周期获得,日期可以直接使用符号“+”即可实现,而月份,则可以使用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'))
至于年份,你懂的,不说了。
相关文章推荐
- js得到连两个时间段之间所有的年-月 获取当前日期 格式化日期 根据指定日期得到该日期该月份的最后一天
- java获得两个日期之间的所有月份
- PHP获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
- PHP获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
- 通过SQL语句来造出两个日期之间的所有月份
- 解析一个日期段之间的所有月份,年份,日期,周数等问题
- java+javascript获得两个日期之间的所有月份
- 判断两个日期之间相差的年份/月份/天数
- java 计算两个日期相差了年份或者月份
- java获得两个日期之间的所有月份和所有
- 设计一个日期类date,包括日期的年份,月份和日号,编写一个友元函数求两个日期之间相差的天数。
- 获取两个日期之间的所有月份
- PHP获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
- PHP 如何获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
- java获得两个日期之间的所有月份
- PHP 如何获取两个时间之间的年和月份及间隔天数 PHP两个日期之间的所有日期
- 用SQL 语句 列出 两个日期之间的年份和月份
- 获取两个日期间的年份差 月份差 日期差
- php判断两个日期之间相差多少个月份的方法
- 【Python】获取两个日期之间的所有日期的列表