在oracle的开发和使用中,经常需要用到各种各样的日期函数,网上日期函数搜索起来一大把,用起来很多有一些小问题,自己动手总结记录下,也能让有缘的同学少走一点弯路。
--常用日期型函数
1、Sysdate当前日期和时间
Select sysdate from dual;
2、Add_months(d,n)当前日期d后推n个月
用于从一个日期值增加或减少一些月份
当前日期后两个月:
Select add_months(sysdate,2) from dual;
当前日期前三个月:
Select add_months(sysdate,-3) from dual;
3、dbtimezone()返回时区
select dbtimezone from dual;
4,round[舍入到最接近的日期](day:舍入到最接近的星期日)
select sysdate S1,
round(sysdate) S2 ,
round(sysdate,'year') YEAR,
round(sysdate,'month') MONTH ,
round(sysdate,'day') DAY fromdual
5、next_day( date, weekday )指定日期的下一个日期
语法: next_day( date,weekday )
select Next_day(to_date(20130107,'yyyymmdd'), 2) from dual ;
该函数功能很强大,但是需要注意,周日是1,周一是2,以此类推
6,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型
select sysdate S1,
trunc(sysdate) S2, --返回当前日期,无时分秒
trunc(sysdate, 'year') YEAR,--返回当前年的1月1日,无时分秒
trunc(sysdate, 'month')MONTH, --返回当前月的1日,无时分秒
trunc(sysdate, 'day') DAY --返回当前星期的星期天,无时分秒
from dual
7、last_day一个月中的最后一天
select last_day(Trunc(SYSDATE, 'MONTH')) from dual
返回最后一天;
如果直接使用selectlast_day(SYSDATE) from dual,不仅仅会返回日期,还会返回当前的时分秒等内容;
8、to_date,to_char日期和字符转换函数用法
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; --日期转化为字符串
select to_char(sysdate,'yyyy') as nowYear from dual; --获取时间的年
select to_char(sysdate,'q') asnowSecond from dual; --获取时间的季度
select to_char(sysdate,'mm') asnowMonth from dual; --获取时间的月
select to_char(sysdate,'dd') asnowDay from dual; -获取时间的日
select to_char(sysdate,'hh24') as nowHour from dual; --获取时间的时
select to_char(sysdate,'mi') asnowMinute from dual; --获取时间的分
select to_char(sysdate,'ss') asnowSecond from dual; --获取时间的秒
将字符串转换为日期类型
select to_date('2013-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual ;
9、months_between两个日期之间的月份差
select months_between(to_date(201302,'yyyymm'),to_date(201212,'yyyymm'))as ans from dual;
10、localtimestamp()返回会话中的日期和时间
select localtimestamp from dual;
常用日期数据格式(该段为摘抄)
Y或YY或YYY年的最后一位,两位或三位Select to_char(sysdate,’YYY’) from dual;002表示2002年
SYEAR或YEAR SYEAR使公元前的年份前加一负号Select to_char(sysdate,’SYEAR’) from dual;-1112表示公元前111 2年
Q季度,1~3月为第一季度Select to_char(sysdate,’Q’) from dual;2表示第二季度①
MM月份数Select to_char(sysdate,’MM’) from dual;12表示12月
RM月份的罗马表示Selectto_char(sysdate,’RM’) from dual;IV表示4月
Month用9个字符长度表示的月份名Select to_char(sysdate,’Month’) from dual;May后跟6个空格表示5月
WW当年第几周Select to_char(sysdate,’WW’) from dual;24表示2002年6月13日为第24周
W本月第几周Select to_char(sysdate,’W’) from dual;2002年10月1日为第1周
DDD当年第几, 1月1日为001,2月1日为032 Select to_char(sysdate,’DDD’) from dual;363 2002年1 2月2 9日为第363天
DD当月第几天Select to_char(sysdate,’DD’) from dual;04 10月4日为第4天
D周内第几天Select to_char(sysdate,’D’) from dual;5 2002年3月14日为星期一
DY周内第几天缩写Selectto_char(sysdate,’DY’) from dual;SUN 2002年3月24日为星期天
HH或HH12 12进制小时数Selectto_char(sysdate,’HH’) from dual;02午夜2点过8分为02
HH24 24小时制Select to_char(sysdate,’HH24’) from dual;14下午2点08分为14
MI分钟数(0~59) Select to_char(sysdate,’MI’) from dual;17下午4点17分
SS秒数(0~59) Select to_char(sysdate,’SS’) from dual;22 11点3分22秒
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
--日期函数的一些具体用法
1、获得上月的最后一天:
select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay fromdual;
2、上个月的今天(同日期)
select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;
3、上个月的第一天
select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') First_Day_Last_Month from dual;
SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH')First_Day_Last_Month FROM dual;
4、获得日期对应的星期几
select to_char(to_date('2013-04-07','yyyy-mm-dd'),'day') from dual;
5、从当前日期到某一个日期的天数
select floor(sysdate -to_date('20130405','yyyymmdd')) from dual;
6、找出今年的天数
selectadd_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
看今年是366天,还是365天。
7、简单的找出闰年
如果2月份的天数是28天,那么就不是闰年
select decode(to_char(last_day(to_date('200902','yyyymm') ),'dd'),'28','不是闰年','闰年' )from dual
8、当前日期是本年的第几天
selectto_char(sysdate,'ddd'),sysdate from dual;
9、查找上月的第一天和最后一刻,本月的第一天和最后一刻
SELECT Trunc(Trunc(SYSDATE,'MONTH') - 1, 'MONTH') First_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') - 1 /86400 Last_Day_Last_Month,
Trunc(SYSDATE, 'MONTH')First_Day_Cur_Month,
LAST_DAY(Trunc(SYSDATE,'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM dual;