1.查询‘2017-12-04’是哪一年哪一月的那一周,注意此时周的计算方法为顺延周(本月的第一到7天为第一周),非自然周。
select TO_CHAR(to_date('2017-12-04', 'yyyy-MM-dd'), 'YYYY') YEAR,
TO_CHAR(to_date('2017-12-04', 'yyyy-MM-dd'), 'MM') month,
TO_CHAR(to_date('2017-12-04', 'yyyy-MM-dd'), 'W') weekfrom dual
2.查询某日是本年的第几周
SELECT to_char(to_date('2017-12-04', 'yyyy-MM-dd'),'iw') from dual
3.计算当前日期的星期一
select to_char(next_day(sysdate-7,2),'YYYY-MM-DD') from dual
注:next_day()求某日期的下一个星期一,第二个参数可以为1或者2,1表示星期日,2表示星期一(一周的第一天为周日)
select to_char(next_day(sysdate,2),'YYYY-MM-DD') from dual ;--下周周一
select to_char(next_day(sysdate,1),'YYYY-MM-DD') from dual ;--本周日
select to_char(next_day(sysdate+7*n,1),'YYYY-MM-DD') from dual;-n周后的周日
4.
select to_char(trunc(sysdate,'d') , 'yyyy-MM-dd') from dual; --本周的第一天(上周周日);
select to_char(trunc(sysdate, 'd')+1 , 'yyyy-MM-dd') from dual;--本周周一
select to_char(trunc(sysdate,'d')+7 ,'yyyy-MM-dd') from dual;--本周日
select to_char(trunc(sysdate, 'd')+7*n , 'yyyy-MM-dd') from dual;--n-1周后的周日
5.
select to_char(sysdate - interval '3' day, 'yyyy-MM-dd') from dual;--三天前
select to_char(sysdate - interval '3' month, 'yyyy-MM-dd') from dual;--三月前
select to_char(sysdate - interval '3' year, 'yyyy-MM-dd') from dual;--三年前
6.按周分组,可以先获取日期的周一,然后group by 周一
如:A表有日期和金额字段,求每周的金额合计值
select rq,to_char(trunc(to_date(rq, 'yyyy-MM-dd'), 'd')+1, 'yyyyMMdd') first,sum(money) from A
group by to_char(trunc(to_date(rq, 'yyyy-MM-dd'), 'd')+1, 'yyyyMMdd')
7.未来30年的年份
select to_char(sysdate,'yyyy')+rownum from dual connect by ROWNUM <=30
未来12个月的所有月份()
SELECT to_char(add_months(SYSDATE, ROWNUM), 'yyyy-MM') rq
FROM dual
connect by ROWNUM <= 12