1、获得当年一年的全部日期:
SELECT TRUNC(SYSDATE, 'YY') + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= 365;
获取当期日前往前推1年到现在的所有日期:
SELECT ADD_MONTHS(SYSDATE,-12) + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= 365;
获取当前日期往前推12个月的所有年月
SELECT TO_CHAR(ADD_MONTHS(SYSDATE,ROWNUM - 13),'YYYYMM') FROM DUAL CONNECT BY ROWNUM <= 12
2、获得当年一月的全部日期:
SELECT TRUNC(SYSDATE, 'YY') + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= 31;
3、获得2018年10月的全部日期:
SELECT TRUNC(to_date('2018-10-09','yyyy-mm-dd'), 'MM') + ROWNUM - 1 FROM DUAL CONNECT BY ROWNUM <= TO_NUMBER(TO_CHAR(LAST_DAY(to_date('2018-10-09','yyyy-mm-dd')), 'DD'));
4、查询星期几:
select to_char(sysdate,'day') day from dual;
select to_char(sysdate, 'DY') from dual;
5、整年的非周末日期:
select dy, to_char(dy, 'DY')
from (SELECT TRUNC(sysdate, 'YY') + ROWNUM - 1 as dy
FROM DUAL
CONNECT BY ROWNUM <= 365)
where to_char(dy, 'DY') <> '星期六'
and to_char(dy, 'DY') <> '星期日';
6、获取本周所有日期:
SELECT sysdate - (to_char(sysdate-1,'D')) + ROWNUM FROM DUAL CONNECT BY ROWNUM <= 7;
7、extract获取年月日:
EXTRACT (
{ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
| { TIMEZONE_HOUR | TIMEZONE_MINUTE }
| { TIMEZONE_REGION | TIMEZONE_ABBR }
FROM { date_value | interval_value } )
注意:我们只可以从一个date类型中截取 year,month,day(date日期的格式为yyyy-mm-dd);
example:
select extract(day from date'2011-05-17'),extract(month from date'2011-05-17') ,extract(year from date'2011-05-17') from dual;
8、利用numtodsinterval()方法,该方法只转换成时分秒,如果溢出,则重新开始。
常用的单位有 ('day','hour','minute','second')
示例:将123.13小时转换成时分秒格式,结果:03:07:48
select SUBSTR(numtodsinterval(123.13,'hour'),12,8) from dual;
select numtodsinterval(123.13,'hour') from dual; +05 03:07:48.000000
9、时间计算:NumToYMInterval(n, interval_unit)
n: 数值类型
interval_unit: 'YEAR', 'MONTH' ,或其他可以转换成这两个值之一的表达式
NumToYMInterval(1, 'YEAR') :一年后的间隔
select sysdate+NumToYMInterval(1, 'YEAR') from dual;
NumToYMInterval(-1, 'MONTH'): 一个月前
小数会被向上取整后,再做计算;
10、时间戳和日期互转:
时间戳转日期:
SELECT TO_DATE('19700101','yyyymmdd') + :1/86400 +TO_NUMBER(SUBSTR(TZ_OFFSET(SESSIONTIMEZONE),1,3))/24 FROM dual;
日期转时间戳;
select (to_date(:1,'yyyy-mm-dd hh24:mi:ss') - to_date('1970-1-1','yyyy-mm-dd'))*86400- TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600 from dual;
11、TRUNC(date,[fmt])截取日期;
trunc(sysdate,'yyyy') --返回当年第一天.
trunc(sysdate,'mm') --返回当月第一天.
trunc(sysdate,'d') --返回当前星期的第一天.