时间问题是经常出现的问题。先抛出两个函数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)格式时,则相同表达:date x
如果x格式为日期时间型(timestamp)格式时,则相同表达:timestamp x
查询系统的当前时间,当前年,当前月,当前日,当前小时,当前分,当前秒
select sysdate 当前时间,
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’) 当前秒
from dual;
--当前时间所在的季度数
Select to_char(sysdate,'Q') from dual;
--当前时间为年的第几周 (注意当前年的第一天为周几)
select to_char(sysdate,'ww') from dual;
--当前时间为月的第几周 (注意当前月的第一天为周几)
select to_char(sysdate,'w') from dual;
--当前时间为年的第几天
Select to_char(sysdate,'DDD') from dual;
再介绍几个时间函数
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(c1 from d1)
【功能】:日期/时间d1中,参数(c1)的值
【参数】:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数)
【参数表】:c1对应的参数表详见示例
【返回】:字符
【示例】
select
extract(hour from timestamp '2001-2-16 2:38:40 ')小时,
extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟,
extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒,
extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日,
extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月,
extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年
from dual;
select extract (YEAR from date '2001-2-16' ) from dual;
select sysdate 当前日期,
extract(hour from timestamp timestamp sysdate) 小时,
extract(DAY from sysdate ) 日,
extract(MONTH from sysdate ) 月,
extract(YEAR from sysdate ) 年
from dual;
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 * from v$nls_parameters where parameter='NLS_DATE_LANGUAGE';这个语句可以查询到当前系统的语言。
通过alter session set NLS_DATE_LANGUAGE=’ SIMPLIFIED CHINESE’来修改当前会话的语言。(SIMPLIFIED CHINESE 为简体中文;AMERICAN 为英语)
select next_day(sysdate,'monday') nextmonday from dual;
nextmonday
-------------------
2011-01-31 17:40:17
scott@YPCOST> select next_day(sysdate,'星期一') from dual;
select next_day(sysdate,'星期一') from dual
*
第 1 行出现错误:
ORA-01846: 周中的日无效
alter session set nls_date_language='SIMPLIFIED CHINESE';
会话已更改。
select next_day(sysdate,'星期一') nextmonday from dual;
nextmonday
-------------------
2011-01-31 17:47:37
--本周第一天和最后一天
select trunc(sysdate,'d')+1 from dual;
select trunc(sysdate,'d')+7 from dual;
--本月第一天和最后一天
select trunc(sysdate,'mm') from dual;
select last_day(trunc(sysdate)) from dual;
--本季第一天和最后一天
select trunc(sysdate,'Q') from dual;
select add_months(trunc(sysdate,'Q'),3)-1 from dual;
--本年第一天和最后一天
select trunc(sysdate,'yyyy') from dual;
select add_months(trunc(sysdate,'yyyy'),12)-1 from dual;
有关时间问题就介绍这么多了,希望大家都能掌握这些函数,并且能够灵活的利用它们
有不足的地方希望大家都能指出!!