您的位置:首页 > 数据库 > Oracle

3.常用的ORACLE函数【日期函数】 .

2012-09-17 15:25 267 查看
一些ORACLE常用函数【日期函数】

【add_months,last_day,months_between,new_time,next_day,round,sysdate,trunc】


<1>ADD_MONTHS

语法: ADD_MONTHS(d,x)

功能: 返回日期d加上x个月后的月份。x可以是任意整数。

如果结果日期中的月份所包含的天数比d日期中的“日”分量要少。

(即相加后的结果日期中的日分量信息已经超过该月的最后一天,

例如,8月31日加上一个月之后得到9月31日,而9月只能有30天)返回结果月份的最后一天。

使用位置: 过程性语言和SQL语句。

ADD_MONTHS 增加或减去月份

SQL> select to_char(add_months(to_date('201209','yyyymm'),2),'yyyymm') 加月份,

to_char(add_months(to_date('201209','yyyymm'),-2),'yyyymm') 减月份 from dual;

加月份 减月份

------ -------

201211 201207

<2>LAST_DAY

语法: LAST_DAY(d)

功能: 计算包含日期的d的月份最后一天的日期.这个函数可以用来计算当月中剩余天数.

使用位置: 过程性语言和SQL语句。

LAST_DAY:返回日期的最后一天

SQL> select to_char(sysdate,'yyyy.mm.dd') 当前日期,

to_char((sysdate)+1,'yyyy.mm.dd') 当前日期加减 from dual;

当前日期 当前日期加减

---------- ----------

2012.09.17 2012.09.18

SQL> select last_day(sysdate) 本月最后一天 from dual;

本月最后一天

------------------

2012/9/30 14:57:56

<3>MONTHS_BETWEEN

语法: MONTHS_BETWEEN(date 1,date2)

功能: 计算date 1和date2之间月数.如果date 1,date2这两个日期中日分量信息是相同的,或者这两个日期都分别是所在月的最后一天,那么返回的结果是一个整数,否则包括一个小数,小数为富余天数除以31.

使用位置: 过程性语言和SQL语句。

MONTHS_BETWEEN(date2,date1): 给出date2-date1的月份

SQL>select months_between(to_date('2012/05/20','yyyy/mm/dd'),

to_date('2005/09/10','yyyy/mm/dd')) mon_betw from dual;

MON_BETW

---------

80.3225806451613

<4>NEW_TIME

语法: NEW_TIME(d,zone1,zone2)

功能: 计算当时区zone1中的日期和时间是s时候,返回时区zone2中的日期和时间. zone1和zone2是字符串.

使用位置: 过程性语言和SQL语句。

NEW_TIME(date,'this','that'):给出在this时区=other时区的日期和时间

NEW_TIME (d,'tz1','tz2')

d::一个有效的日期型变量

tz1 & tz2::下表中的任一时区

时区1 时区2 说明

AST ADT 大西洋标准时间

BST BDT 白令海标准时间

CST CDT 中部标准时间

EST EDT 东部标准时间

GMT 格林尼治标准时间

HST HDT 阿拉斯加—夏威夷标准时间

MST MDT 山区标准时间

NST 纽芬兰标准时间

PST PDT 太平洋标准时间

YST YDT YUKON标准时间

SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') bj_time,to_char(new_time

(sysdate,'PDT','GMT'),'yyyy/mm/dd hh24:mi:ss') los_angles from dual;

BJ_TIME LOS_ANGLES

------------------- -------------------

2004.05.09 11:05:32 2004.05.09 18:05:32

<5>NEXT_DAY

语法: NEXT_DAY(d,string)

功能: 计算在日期d后满足由string给出的条件的第一天.String使用位置;当前会话的语言指定了一周中的某一天.

返回值的时间分量与d的时间分量是相同的. String的内容可以忽略大小写.

使用位置: 过程性语言和SQL语句。

NEXT_DAY(date,'day'):给出日期date和星期x之后计算下一个星期的日期

SQL> select next_day('17-9月-2012','星期六') next_day from dual;

NEXT_DAY

----------

2012/9/22

<6>ROUND

语法: ROUND(d[,format])

功能: 将日期d按照由format指定的格式进行处理.如果没有给format则使用缺省设置'DD'.

使用位置: 过程性语言和SQL语句。

<7>SYSDATE

语法: SYSDATE

功能: 取得当前的日期和时间,类型是DATE.它没有参数.

但在分布式SQL语句中使用时,SYSDATE返回本地数据库的日期和时间.

使用位置: 过程性语言和SQL语句。

SYSDATE 用来得到系统的当前日期

SQL> select to_char(sysdate,'dd/mm/yyyy day') 系统日期 from dual;

系统日期

-----------------

17/09/2012 星期一

<8>TRUNC

语法: TRUNC(d,format)

功能: 计算截尾到由format指定单位的日期d.可以使用位置:格式和效果.缺省参数同ROUNG.

使用位置: 过程性语言和SQL语句。

trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒

SQL> select to_char(trunc(sysdate,'hh'),'yyyy/mm/dd hh24:mi:ss') HH,

to_char(trunc(sysdate,'mi'),'yyyy/mm/dd hh24:mi:ss') HHMM,

to_char(trunc(sysdate,'dd'),'yyyy/mm/dd hh24:mi:ss') DD,

to_char(trunc(sysdate,'mm'),'yyyy/mm/dd hh24:mi:ss') MM from dual;

HH HHMM DD MM

------------------- ------------------- ------------------- -------------------

2012/09/17 14:00:00 2012/09/17 14:56:00 2012/09/17 00:00:00 2012/09/01 00:00:00

<9>其他常用:获取系统当前月的第一天和最后一天

select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天",

to_char(last_day(sysdate), 'yyyy-mm-dd') "本月最后一天" from dual;

-------

2012-09-01 2012-09-30

select trunc(add_months(last_day(sysdate), -1) + 1) AS 系统当月第一天,

last_day(sysdate)AS 系统当月最后一天 from dual;

-----------------

2012/9/1 2012/9/30 15:06:01

select to_char(sysdate,'yyyy/mm')||'/01' firstday,

to_char(last_day(sysdate),'yyyy/mm/dd') lastday from dual;

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

-----------------------------------

2012/8/1 2012/8/31 23:59:59 2012/9/1 2012/9/30 23:59:59

==============================================================

常用日期数据格式(该段为摘抄)

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 月份的罗马表示

Select to_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 周内第几天缩写

Select to_char(sysdate,'DY') from dual; SUN 2002年3月24日为星期天

HH或HH12 12进制小时数

Select to_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是用于月份的格式,将它用于分钟也能工作,但结果是错误的。

==============================================================

Oracle时间日期操作

sysdate+(5/24/60/60) 在系统时间基础上延迟5秒

sysdate+5/24/60 在系统时间基础上延迟5分钟

sysdate+5/24 在系统时间基础上延迟5小时

sysdate+5 在系统时间基础上延迟5天

add_months(sysdate,-5) 在系统时间基础上延迟5月

add_months(sysdate,-5*12) 在系统时间基础上延迟5年

--加1年

select sysdate,add_months(sysdate,12) from dual;

--加1月

select sysdate,add_months(sysdate,1) from dual;

--加1星期

select sysdate,TO_CHAR(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1天

select sysdate,TO_CHAR(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1小时

select sysdate,TO_CHAR(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1分钟

select sysdate,TO_CHAR(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;

--加1秒

select sysdate,TO_CHAR(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;

--加7天

select sysdate+7 from dual;

--上月末的日期:

select last_day(add_months(sysdate, -1)) from dual;

--本月的最后一秒:

select trunc(add_months(sysdate,1),'MM') - 1/24/60/60 from dual;

--本周星期一的日期:

select trunc(sysdate,'day')+1 from dual;

--年初至今的天数:

select ceil(sysdate - trunc(sysdate, 'year')),

trunc(sysdate, 'year') from dual;

--今天是今年的第几周 :

select to_char(sysdate,'fmww') from dual;

--今天是本月的第几周:

SELECT TO_CHAR(SYSDATE,'WW') - TO_CHAR(TRUNC(SYSDATE,'MM'),'WW') + 1 AS "weekOfMon" FROM dual;

--本月的天数

SELECT to_char(last_day(SYSDATE),'dd') days FROM dual

--今年的天数

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

--下个星期一的日期

SELECT Next_day(SYSDATE,'星期一') FROM dual

--判断当前时间是上午下午还是晚上

SELECT CASE

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 6 AND 11 THEN '上午'

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 11 AND 17 THEN '下午'

WHEN to_number(to_char(SYSDATE,'hh24')) BETWEEN 17 AND 21 THEN '晚上'

END

FROM dual;

----计算小时,分,秒,毫秒

select Days, A,

TRUNC(A*24) Hours,

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

from

( select trunc(sysdate) Days, sysdate - trunc(sysdate) A

from dual )

--------------------------

2012/9/17 0.644305555555556 15 27 48 0

**************************************************************************************************************************************





====
Till good is better, but better best






====“我的努力不会停止,敬请期待吧!”My
trying hard will go on!Please wait and see!


**************************************************************************************************************************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: