Oracle与日期相关函数及技巧(超全)

--date类型的sysdate,timestamp类型的SYSTIMESTAMP,后者精度高

--date 转为 timestamp
select cast(sysdate as timestamp) from dual;

--timestamp 转为 date
select to_date(to_char(SYSTIMESTAMP,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual;

select SYSTIMESTAMP+0 from dual;

--对sysdate的运用
select 
	to_char(sysdate, 'yyyy') 年,
    to_char(sysdate, 'mm') 月,
    to_char(sysdate, 'dd') 日,
    to_char(sysdate, 'hh24') 时,
    to_char(sysdate, 'mi') 分,
    to_char(sysdate, 'ss') 秒,
    to_char(sysdate, 'day') 周几,
    to_char(sysdate, 'q') 第几季度,
    to_char(sysdate, 'w') 当月第几周,
    to_char(sysdate, 'ww') 当年第几周,
    to_char(sysdate, 'd') 当周第几天,
    to_char(sysdate, 'ddd') 当年第几天    
from dual;

--其他时间运用
SELECT 
	current_date,--当前时间(date)
	localtimestamp,--当前时间(timestamp)
	current_timestamp,--当前时间(timestamp) + 当前时区
	sessiontimezone,--当前时区
	dbtimezone --数据库所在时区
from dual;

--TO_CHAR:将日期转换为字符串,可以截取某一部分
select TO_CHAR(sysdate,'yyyymm') from dual;

--TO_DATE:将字符串转换为日期
select TO_DATE('20130104','yyyymmdd') from dual;

--ADD_MONTHS:增加月份的函数
select ADD_MONTHS(sysdate,1),ADD_MONTHS(sysdate,-1) from dual;

--直接在日期上面加减数字,表示的是天,配合乘除可以到小时,分钟,秒
select sysdate+1,sysdate+(1/24),sysdate+(1/(24*60)),sysdate+(1/(24*60*60)) from dual;

--Oracle两个日期之间是可以直接相减得到差值
select to_date('2018-05-03 20:00:00','yyyy-mm-dd hh24:mi:ss')-to_date('2018-05-01 12:00:00','yyyy-mm-dd hh24:mi:ss') A from dual;

--last_day返回当月的最后一天
select last_day(sysdate) from dual;

--months_between(date1,date2)返回两个时间相差的月份数(date1-date2)(小数部分默认除以31)
select months_between(to_date('2018-02-28','yyyy-mm-dd'),to_date('2018-05-31','yyyy-mm-dd')) A,months_between(to_date('2018-05-15','yyyy-mm-dd'),to_date('2018-2-14','yyyy-mm-dd')) B from dual;

--next_day按周计算,获取下一次出现指定周几的日期(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday)
select sysdate,next_day(sysdate,'MONDAY') from dual;

--EXTRACT,返回时间的指定单位,返回值为数值格式,但是只能单独返回年、月、日等
SELECT 
	SYSDATE ,
    EXTRACT(YEAR FROM SYSDATE) "year",
    EXTRACT(MONTH FROM SYSDATE) "month",
    EXTRACT(DAY FROM SYSDATE) "day",
    EXTRACT(HOUR FROM SYSTIMESTAMP) "hour",
    EXTRACT(MINUTE FROM SYSTIMESTAMP) "minute",
    EXTRACT(SECOND FROM SYSTIMESTAMP) "second"
FROM dual;

--ROUND对时间的作用,默认为 ROUND(SYSDATE)=ROUND(SYSDATE,'dd')
SELECT SYSDATE,ROUND(SYSDATE),ROUND(SYSDATE,'dd'),ROUND(SYSDATE,'day'),ROUND(SYSDATE,'month'),ROUND(SYSDATE,'year') FROM dual;


--trunc对时间的作用

--获取当年的第一天
select trunc(sysdate, 'yy') from dual;
select trunc(sysdate,'yyyy') from dual;
select trunc(sysdate,'year') from dual;

--获取当年的最后一天
SELECT ADD_MONTHS (TRUNC (SYSDATE, 'YEAR'), 12) - 1  FROM DUAL;
select TO_DATE((EXTRACT (year from sysdate) ) || '1231', 'yyyymmdd')  from dual;

--获取当季度的第一天
select trunc(sysdate, 'q') from dual;

--获取当前季度的最后一天并23:00
select trunc(add_months(sysdate,3), 'Q') -1/24  from dual; 

--获取当月的第一天
select trunc(sysdate, 'mm') from dual;
select trunc(sysdate, 'month') from dual;

--获取当月的最后一天
SELECT TRUNC (LAST_DAY (SYSDATE)) FROM DUAL;
select ADD_MONTHS( trunc ( sysdate,'month'), 1) - 1 from dual;

--获取本周的第一天(周日)
select trunc(sysdate,'d') from dual;
select trunc(sysdate,'day') from dual;

--获取本周的最后一天
select trunc(sysdate,'d') + 7 from dual;

--获取当前日的开始时间
select trunc(sysdate,'dd') from dual;
select trunc(sysdate) from dual;

--获取当前小时的开始时间
select trunc(sysdate, 'hh')"当前小时" from dual;  
select trunc(sysdate, 'hh24') "当前小时" from dual; 

--获取当前分钟的开始时间
select trunc(sysdate, 'mi') from dual;

--获取当前秒,直接sysdate即可
select sysdate from dual; 




--其他

--获取当前月的天数
SELECT CAST (TO_CHAR (LAST_DAY (SYSDATE), 'dd') AS INT)  FROM DUAL;

--获取当前月剩余的天数
SELECT 
	SYSDATE,
	LAST_DAY (SYSDATE) "Last",
	LAST_DAY (SYSDATE) - SYSDATE "Days left"
FROM DUAL;

--获取两个日期之间的天数
select ROUND(to_date('2018-05-03 20:00:00','yyyy-mm-dd hh24:mi:ss')-to_date('2018-05-01 12:00:00','yyyy-mm-dd hh24:mi:ss'),0) A from dual;

--获取当前年份截止到上个月每个月份开始和结束的日期
SELECT 
	ADD_MONTHS (TRUNC (SYSDATE, 'MONTH'), i) start_date,
    TRUNC (LAST_DAY (ADD_MONTHS (SYSDATE, i))) end_date
FROM XMLTABLE (
    'for $i in 0 to xs:int(D) return $i'
    PASSING XMLELEMENT (d, FLOOR (MONTHS_BETWEEN ( ADD_MONTHS (TRUNC (SYSDATE, 'YEAR') - 1, 12), SYSDATE)))
    COLUMNS i INTEGER PATH '.');


--根据某一天具体日期,查找该日为星期几,并得到星期一和星期日具体日期
select 
	to_char(sysdate, 'yyyy-mm-dd') "今天",
	decode(to_char(sysdate, 'D'), '1', '星期日', '2', '星期一', '3', '星期二', '4', '星期三', '5', '星期四', '6', '星期五', '7', '星期六') "星期几",
	to_char(sysdate - to_number(to_char(sysdate, 'D')) + 2, 'yyyy-mm-dd') "星期一",
	to_char(sysdate - to_number(to_char(sysdate, 'D')) + 8, 'yyyy-mm-dd') "星期日"
from dual;


select 
	to_char(sysdate, 'yyyy-mm-dd') 今天,
	'星期'||substr('日一二三四五六',to_number(to_char(sysdate,'d')),1) 星期几,
	to_char(next_day(sysdate,'MONDAY')-7,'yyyy-mm-dd') "星期一",
	to_char(next_day(sysdate,'MONDAY')-1,'yyyy-mm-dd') "星期日"
from dual;


--查找2018-05-14至2018-05-01间除星期一和七的天数
select count(*) 
from 
	(select rownum - 1 rnum from all_objects where rownum <= to_date('2018-05-14', 'yyyy-mm-dd') -  to_date('2018-05-01', 'yyyy-mm-dd') + 1)
where to_char(to_date('2018-05-01', 'yyyy-mm-dd') + rnum - 1, 'D') not in ('1', '7');


--获取今年的天数
select add_months(trunc(sysdate,'year'),12)-trunc(sysdate,'year') from dual;


SELECT 
	sysdate,
	Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
	Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
       (Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
  FROM dual;
  
--获取月的第一天,最后一天
SELECT 
	sysdate,
	Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
	Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
	(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;

--判断某年是不是闰年
select decode(to_char(last_day(to_date('200902','yyyymm') ),'dd'),'28','不是闰年','闰年' )from dual;

参考:https://blog.csdn.net/qq_33459369/article/details/80305175

           https://www.oschina.net/question/1428332_141874

发布了35 篇原创文章 · 获赞 7 · 访问量 3357

猜你喜欢

转载自blog.csdn.net/Hjchidaozhe/article/details/97471911