Oracle 时间问题

    技术2024-07-31  59

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

    TO_CHAR(x[[,c2],C3])【功能】将日期或数据转换为char数据类型【参数】x是一个datenumber数据类型。c2为格式参数c3NLS设置参数如果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)