Oracle 时间问题

 时间问题是经常出现的问题。先抛出两个函数to_date()to_char()这两个是处理时间问题的常用函数。时间类型进行算术加减运算都是以天为单位的。

TO_CHAR(x[[,c2],C3])
【功能】将日期或数据转换为char数据类型

【参数】
x
是一个datenumber数据类型。
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点日期: 取消参数c1j
最近的星期日:daydyd
最近月初日期:monthmonmmrm 
最近季日期:q
最近年初日期:syearyearyyyyyyyyyy(多个y表示精度)  
最近世纪初日期:ccscc
 
trunc(d1[,c1])
【功能】:返回日期d1所在期间(参数c1)的第一天日期
【参数】:d1日期型,c1为字符型(参数)c1默认为j(即当前日期)
【参数表】:c1对应的参数表:
最近0点日期: 取消参数c1j
最近的星期日:daydyd (每周顺序:日,一,二,三,四,五,六)
最近月初日期:monthmonmmrm 
最近季日期:q
最近年初日期:syearyearyyyyyyyyyy(多个y表示精度)  
最近世纪初日期:ccscc
 
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之间的月数。
【参数】:d1d2 日期型

 

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;

 

有关时间问题就介绍这么多了,希望大家都能掌握这些函数,并且能够灵活的利用它们

有不足的地方希望大家都能指出!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值