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

Oracle 时间问题

2011-01-31 20:35 381 查看
时间问题是经常出现的问题。先抛出两个函数to_date(),to_char()这两个是处理时间问题的常用函数。时间类型进行算术加减运算都是以天为单位的。
TO_CHAR(x[[,c2],C3])
【功能】将日期或数据转换为char数据类型
【参数】
x是一个date或number数据类型。
c2为格式参数
c3为NLS设置参数
如果x为日期nlsparm=NLS_DATE_LANGUAGE控制返回的月份和日份所使用的语言。

TO_DATE(X[,c2[,c3]])

【功能】将字符串X转化为日期型

【参数】c2,c3,字符型,参照to_char()

【返回】字符串

如果x格式为日期型(date)格式时,则相同表达:datex

如果x格式为日期时间型(timestamp)格式时,则相同表达:timestampx


查询系统的当前时间,当前年,当前月,当前日,当前小时,当前分,当前秒

selectsysdate当前时间,
to_char(sysdate,’yyyy’)当前年,
to_char(sysdate,’mm’)当前月,
to_char(sysdate,’dd’)当前日,
to_char(sysdate,’hh24’)当前小时,--如果是hh12就是12小时制
to_char(sysdate,’mi’)当前分,
to_char(sysdate,’ss’)当前秒
fromdual;
--当前时间所在的季度数
Selectto_char(sysdate,'Q')fromdual;

--当前时间为年的第几周(注意当前年的第一天为周几)
selectto_char(sysdate,'ww')fromdual;

--当前时间为月的第几周(注意当前月的第一天为周几)
selectto_char(sysdate,'w')fromdual;

--当前时间为年的第几天
Selectto_char(sysdate,'DDD')fromdual;

再介绍几个时间函数

round(d1[,c1])

【功能】:给出日期d1按期间(参数c1)四舍五入后的期间的第一天日期(与数值四舍五入意思相近)

【参数】:d1日期型,c1为字符型(参数),c1默认为j(即最近0点日期)

【参数表】:c1对应的参数表:

最近0点日期:取消参数c1或j

最近的星期日:day或dy或d

最近月初日期:month或mon或mm或rm

最近季日期:q

最近年初日期:syear或year或yyyy或yyy或yy或y(多个y表示精度)

最近世纪初日期:cc或scc


trunc(d1[,c1])

【功能】:返回日期d1所在期间(参数c1)的第一天日期

【参数】:d1日期型,c1为字符型(参数),c1默认为j(即当前日期)

【参数表】:c1对应的参数表:

最近0点日期:取消参数c1或j

最近的星期日:day或dy或d(每周顺序:日,一,二,三,四,五,六)

最近月初日期:month或mon或mm或rm

最近季日期:q

最近年初日期:syear或year或yyyy或yyy或yy或y(多个y表示精度)

最近世纪初日期:cc或scc


extract(c1fromd1)

【功能】:日期/时间d1中,参数(c1)的值

【参数】:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数)

【参数表】:c1对应的参数表详见示例

【返回】:字符


【示例】

select

extract(hourfromtimestamp'2001-2-162:38:40')小时,

extract(minutefromtimestamp'2001-2-162:38:40')分钟,

extract(secondfromtimestamp'2001-2-162:38:40')秒,

extract(DAYfromtimestamp'2001-2-162:38:40')日,

extract(MONTHfromtimestamp'2001-2-162:38:40')月,

extract(YEARfromtimestamp'2001-2-162:38:40')年

fromdual;


selectextract(YEARfromdate'2001-2-16')fromdual;



selectsysdate当前日期,

extract(hourfromtimestamptimestampsysdate)小时,

extract(DAYfromsysdate)日,

extract(MONTHfromsysdate)月,

extract(YEARfromsysdate)年

fromdual;


add_months(d1,n1)

【功能】:返回在日期d1基础上再加n1个月后新的日期。

【参数】:d1,日期型,n1数字型

【返回】:日期


last_day(d1)

【功能】:返回日期d1所在月份最后一天的日期。

【参数】:d1,日期型

【返回】:日期


months_between(d1,d2)

【功能】:返回日期d1到日期d2之间的月数。

【参数】:d1,d2日期型


next_day(d1[,c1])

【功能】:返回日期d1在下周,星期几(参数c1)的日期

【参数】:d1日期型,c1为字符型(参数),c1默认为j(即当前日期)

【参数表】:c1对应:星期一,星期二,星期三……星期日

【返回】:日期

注意:这个next_day()函数和当前会话语言有关,我下面的这个例子就很好的说明了这一点。
通过select*fromv$nls_parameterswhereparameter='NLS_DATE_LANGUAGE';这个语句可以查询到当前系统的语言。
通过altersessionsetNLS_DATE_LANGUAGE=’SIMPLIFIEDCHINESE’来修改当前会话的语言。(SIMPLIFIEDCHINESE为简体中文;AMERICAN为英语)
selectnext_day(sysdate,'monday')nextmondayfromdual;

nextmonday
-------------------
2011-01-3117:40:17

scott@YPCOST>selectnext_day(sysdate,'星期一')fromdual;
selectnext_day(sysdate,'星期一')fromdual
*
第1行出现错误:
ORA-01846:周中的日无效
altersessionsetnls_date_language='SIMPLIFIEDCHINESE';

会话已更改。

selectnext_day(sysdate,'星期一')nextmondayfromdual;

nextmonday
-------------------
2011-01-3117:47:37

--本周第一天和最后一天
selecttrunc(sysdate,'d')+1fromdual;
selecttrunc(sysdate,'d')+7fromdual;

--本月第一天和最后一天
selecttrunc(sysdate,'mm')fromdual;
selectlast_day(trunc(sysdate))fromdual;

--本季第一天和最后一天
selecttrunc(sysdate,'Q')fromdual;
selectadd_months(trunc(sysdate,'Q'),3)-1fromdual;

--本年第一天和最后一天
selecttrunc(sysdate,'yyyy')fromdual;
selectadd_months(trunc(sysdate,'yyyy'),12)-1fromdual;

有关时间问题就介绍这么多了,希望大家都能掌握这些函数,并且能够灵活的利用它们
有不足的地方希望大家都能指出!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: