Oracle 时间&日期&时间戳查询整理

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') --返回当前星期的第一天.


版权声明:本文为hoennhi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。