精华内容
下载资源
问答
  • Oracle 表示日期

    千次阅读 2010-06-12 08:41:00
    得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式. PARAMETER ----------------------------------- ----------------------------------- NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ ...

     

    查询Oracle日期格式

    select  *  from nls_database_parameters;

    得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式.
    PARAMETER
    ----------------------------------- -----------------------------------

    NLS_LANGUAGE AMERICAN
    NLS_TERRITORY AMERICA
    NLS_CURRENCY $
    NLS_ISO_CURRENCY AMERICA
    NLS_NUMERIC_CHARACTERS .,
    NLS_CHARACTERSET ZHS16GBK
    NLS_CALENDAR GREGORIAN
    NLS_DATE_FORMAT DD-MON-RR
    NLS_DATE_LANGUAGE AMERICAN
    NLS_SORT BINARY
    NLS_TIME_FORMAT HH.MI.SSXFF AM
    NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
    NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
    NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
    NLS_DUAL_CURRENCY $
    NLS_COMP BINARY
    NLS_NCHAR_CHARACTERSET ZHS16GBK
    NLS_RDBMS_VERSION 8.1.7.0.0

    或者查询V$NLS_PARAMETERS表

    select  *  from V$NLS_PARAMETERS;

    也有类似结果.


    to_date 字符串类型转为换日期类型
      to_date 字符串类型转为换日期类型 ,字符串中的相应位置上的字符,必须符合时间范围的限制
    SQL>select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') from dual;
    -------------------
    2004.11.12 12:07:32

    SQL>select to_date('20041015') from dual;
    -------------------
    2004.10.15 00:00:00


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

    ParameterExplanation
    YEARYear, spelled out
    YYYY4-digit year
    YYY
    YY
    Y
    Last 3, 2, or 1 digit(s) of year.
    IYY
    IY
    I
    Last 3, 2, or 1 digit(s) of ISO year.
    IYYY4-digit year based on the ISO standard
    QQuarter of year (1, 2, 3, 4; JAN-MAR = 1).
    MMMonth (01-12; JAN = 01).
    MONAbbreviated name of month.
    MONTHName of month, padded with blanks to length of 9 characters.
    RMRoman numeral month (I-XII; JAN = I).
    WWWeek of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
    WWeek of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
    IWWeek of year (1-52 or 1-53) based on the ISO standard.
    DDay of week (1-7).
    DAYName of day.
    DDDay of month (1-31).
    DDDDay of year (1-366).
    DYAbbreviated name of day.
    JJulian day; the number of days since January 1, 4712 BC.
    HHHour of day (1-12).
    HH12Hour of day (1-12).
    HH24Hour of day (0-23).
    MIMinute (0-59).
    SSSecond (0-59).
    SSSSSSeconds past midnight (0-86399).
    FFFractional seconds.

     

    ORACLE数据的日期函数
    add_months(d,n)   日期d加n个月
    last_day(d)       包含d的月?的最后一天的日期
    new_time(d,a,b)   a?区的日期和??d在b?区的日期和??
    next_day(d,day)   比日期d?,由day指定的周几的日期
    sysdate           当前的系?日期和??
    greatest(d1,d2,...dn) ?出的日期列表中最后的日期
    least(d1,k2,...dn)    ?出的日期列表中最早的日期
    to_char(d [,fmt])     日期d按fmt指定的格式??成字符串
    to_date(st [,fmt])    字符串st按fmt指定的格式?成日期?,若fmt忽略,st要用缺省格式
    round(d [,fmt])       日期d按fmt指定格式舍入到最近的日期
    trunc(d [,fmt])       日期d按fmt指定格式截断到最近的日期
    to_date               字符串类型转为换日期类型,字符串中的相应位置上的字符,必须符合时间范围的限制

    常用日期型函数
    1)Sysdate 当前日期和时间
    SQL> Select sysdate from dual;
    SYSDATE
    ----------
    21-6月 -05

    2)Last_day 本月最后一天
    SQL> Select last_day(sysdate) from dual;

    LAST_DAY(S
    ----------
    30-6月 -05

    3)Add_months(d,n) 当前日期d后推n个月
    用于从一个日期值增加或减少一些月份
    date_:=add_months(date_,number_of_months)

    SQL> Select add_months(sysdate,2) from dual;
    ADD_MONTHS
    ----------
    21-8月 -05

    4)Months_between(f,s) 日期f和s间相差月数
    SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;

    MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-DD'))
    ----------------------------------------------------------
    -4.6966741

    5)NEXT_DAY(d, day_of_week)
    返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。
    SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;

    NEXT_DAY(T
    ----------
    26-6月 -05

    6)current_date()返回当前会话时区中的当前日期
    date_:=current_date
    SQL> column sessiontimezone for a15
    SQL> select sessiontimezone,current_date from dual;

    SESSIONTIMEZONE CURRENT_DA
    --------------- ----------
    +08:00 13-11月-03

    SQL> alter session set time_zone='-11:00' 2 /
    会话已更改。

    SQL> select sessiontimezone,current_timestamp from dual;

    SESSIONTIMEZONE CURRENT_TIMESTAMP
    --------------- ------------------------------------
    -11:00 12-11月-03 04.59.13.668000 下午 -11:00

    7)current_timestamp()以timestamp with time zone数据类型返回当前会话时区中的当前日期
    SQL> select current_timestamp from dual;

    CURRENT_TIMESTAMP
    ---------------------------------------------------------------------------
    21-6月 -05 10.13.08.220589 上午 +08:00

    8)dbtimezone()返回时区
    SQL> select dbtimezone from dual;

    DBTIME
    ------
    -08:00

    9)extract()找出日期或间隔值的字段值
    date_:=extract(date_field from [datetime_|interval_])
    SQL> select extract(month from sysdate) "This Month" from dual;

    This Month
    ----------
    6

    SQL> select extract(year from add_months(sysdate,36)) " Years" from dual;

    Years
    ----------
    2008

    10)localtimestamp()返回会话中的日期和时间
    SQL> select localtimestamp from dual;

    LOCALTIMESTAMP
    ---------------------------------------------------------------------------
    21-6月 -05 10.18.15.855652 上午

     


    现在给出一些实践后的用法:

    1。上月末天:
    SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from
    dual;

    LASTDAY
    ----------
    2005-05-31

    2。上月今天
    SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;


    PRETODAY
    ----------
    2005-05-21

    3.上月首天
    SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

    FIRSTDAY
    ----------
    2005-05-01

    4.按照每周进行统计
    SQL> select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww');

    TO
    --
    25

    5。按照每月进行统计
    SQL> select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm');

    TO
    --
    06

    6。按照每季度进行统计
    SQL> select to_char(sysdate,'q') from dual group by to_char(sysdate,'q');

    T
    -
    2

    7。按照每年进行统计
    SQL> select to_char(sysdate,'yyyy') from dual group by to_char(sysdate,'yyyy');

    TO_C
    ----
    2005

    8.要找到某月中所有周五的具体日期
    select to_char(t.d,'YY-MM-DD') from (
    select trunc(sysdate, 'MM')+rownum-1 as d
    from dba_objects
    where rownum < 32) t
    where to_char(t.d, 'MM') = to_char(sysdate, 'MM') --找出当前月份的周五的日期

    and trim(to_char(t.d, 'Day')) = '星期五'
    --------
    03-05-02
    03-05-09
    03-05-16
    03-05-23
    03-05-30

    如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中的每周五的日期。

    9.oracle中时间运算

    内容如下:
    1、oracle支持对日期进行运算
    2、日期运算时是以天为单位进行的
    3、当需要以分秒等更小的单位算值时,按时间进制进行转换即可
    4、进行时间进制转换时注意加括号,否则会出问题

    SQL> alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';

    会话已更改。

    SQL> set serverout on
    SQL> declare
    2 Date date;
    3 begin
    4 select sysdate into Date from dual;
    5 dbms_output.put_line('源时间:'||to_char(Date));
    6 dbms_output.put_line('源时间减1天:'||to_char(Date-1));
    7 dbms_output.put_line('源时间减1天1小时:'||to_char(Date-1-1/24));
    8 dbms_output.put_line('源时间减1天1小时1分:'||to_char(Date-1-1/24-1/(24*60)));
    9 dbms_output.put_line('源时间减1天1小时1分1秒:'||to_char(Date-1-1/24-1/(24*60)-1 /(24*60*60)));
    10 end;
    11 /
    源时间:2003-12-29 11:53:41
    源时间减1天:2003-12-28 11:53:41
    源时间减1天1小时:2003-12-28 10:53:41
    源时间减1天1小时1分:2003-12-28 10:52:41
    源时间减1天1小时1分1秒:2003-12-28 10:52:40

    PL/SQL 过程已成功完成。

     

    在Oracle中实现时间相加处理
    -- 名称:Add_Times
    -- 功能:返回d1与NewTime相加以后的结果,实现时间的相加
    -- 说明:对于NewTime中的日期不予考虑
    -- 日期:2004-12-07
    -- 版本:1.0
    -- 作者:Kevin


    create or replace Add_Times(d1 in date,NewTime in date) return date
    is
    hh number;
    mm number;
    ss number;
    hours number;
    dResult date;
    begin
    -- 下面依次取出时、分、秒
    select to_number(to_char(NewTime,'HH24')) into hh from dual;
    select to_number(to_char(NewTime,'MI')) into mm from dual;
    select to_number(to_char(NewTime,'SS')) into ss from dual;
    -- 换算出NewTime中小时总和,在一天的百分几
    hours := (hh + (mm / 60) + (ss / 3600))/ 24;
    -- 得出时间相加后的结果
    select d1 + hours into dResult from dual;
    return(dResult);
    end Add_Times;


    -- 测试用例
    -- select Add_Times(sysdate,to_date('2004-12-06 03:23:00','YYYY-MM-DD HH24:MI:SS')) from dual


    在Oracle9i中计算时间差
    计算时间差是Oracle DATA数据类型的一个常见问题。Oracle支持日期计算,你可以创建诸如“日期1-日期2”这样的表达式来计算这两个日期之间的时间差。


    一旦你发现了时间差异,你可以使用简单的技巧来以天、小时、分钟或者秒为单位来计算时间差。为了得到数据差,你必须选择合适的时间度量单位,这样就可以进 行数据格式隐藏。

    使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法。

    round(to_number(end-date-start_date))- 消逝的时间(以天为单位)

    round(to_number(end-date-start_date)*24)- 消逝的时间(以小时为单位)

    round(to_number(end-date-start_date)*1440)- 消逝的时间(以分钟为单位)

    显示时间差的默认模式是什么?为了找到这个问题的答案,让我们进行一个简单的SQL *Plus查询。

    SQL> select sysdate-(sysdate-3) from dual;

    SYSDATE-(SYSDATE-3)
    -------------------
    3

    这里,我们看到了Oracle使用天来作为消逝时间的单位,所以我们可以很容易的使用转换函数来把它转换成小时或者分钟。然而,当分钟数不是一个整数时, 我们就会遇到放置小数点的问题。

    Select
    (sysdate-(sysdate-3.111))*1440
    from
    dual;

    (SYSDATE-(SYSDATE-3.111))*1440
    ------------------------------
    4479.83333

    当然,我们可以用ROUND函数(即取整函数)来解决这个问题,但是要记住我们必须首先把DATE数据类型转换成NUMBER数据类型。

    Select
    round(to_number(sysdate-(sysdate-3.111))*1440)
    from
    dual;

    ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)
    ----------------------------------------------
    4480

    我们可以用这些函数把一个消逝时间近似转换成分钟并把这个值写入Oracle表格中。在这个例子里,我们有一个离线(logoff)系统级触发机制来计算 已经开始的会话时间并把它放入一个Oracle STATSPACK USER_LOG扩展表格之中。

    Update
    perfstat.stats$user_log
    set
    elapsed_minutes =
    round(to_number(logoff_time-logon_time)*1440)
    where
    user = user_id
    and
    elapsed_minutes is NULL;

    查出任一年月所含的工作日
    CREATE OR REPLACE Get_WorkingDays(
    ny IN VARCHAR2
    ) RETURN INTEGER IS
    /*------------------------------------------------------------------------------------------
    函数名称:Get_WorkingDays
    中文名称:求某一年月中共有多少工作日
    作者姓名: XINGPING
    编写时间: 2004-05-22
    输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
    返 回 值:整型值,包含的工作日数目。
    算法描述:
    1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视 图)来构造出某年月的每一天。
    2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得 的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模.
    3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。
    -------------------------------------------------------------------------------------------------*/
    Result INTEGER;
    BEGIN
    SELECT COUNT(*) INTO Result
    FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday
    FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq
    FROM (SELECT substr(100+ROWNUM,2,2) dd
    FROM ljrq z WHERE Rownum<=31
    ) t
    WHERE to_date(ny||t.dd,'yyyymmdd')
    BETWEEN to_date(ny,'yyyymm')
    AND last_day(to_date(ny,'yyyymm'))
    )q
    ) a
    WHERE a.weekday NOT IN(0,6);
    RETURN Result;
    END Get_WorkingDays;

    ______________________________________

    还有一个版本
    CREATE OR REPLACE Get_WorkingDays(
    ny IN VARCHAR2
    ) RETURN INTEGER IS
    /*-----------------------------------------------------------------------------------------
    函数名称:Get_WorkingDays
    中文名称:求某一年月中共有多少工作日
    作者姓名: XINGPING
    编写时间: 2004-05-23
    输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
    返 回 值:整型值,包含的工作日数目。
    算 法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期 (2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于- 6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。
    ----------------------------------------------------------------------------------------*/
    Result INTEGER := 0;
    myts INTEGER; --所给年月的天数
    scts INTEGER; --某天距2001-12-30所差的天数
    rq DATE;
    djt INTEGER := 1; --
    BEGIN
    myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');
    LOOP
    rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
    scts := rq - to_date('2001-12-30','yyyy-mm-dd');
    IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
    Result := Result + 1;
    END IF;
    djt := djt + 1;
    EXIT WHEN djt>myts;
    END LOOP;
    RETURN Result;
    END Get_WorkingDays;

    以上两个版本的比较


    第一个版本一条SQL语句就可以得出结果,不需要编程就可以达到目的。但需要使用任意一张有权访问的、记录条数至少为31的一张表或视图。
    第二个版本需要编程,但不需要表或者视图。
    这两个版本都还存在需要完善的地方,即没有考虑节日,如五一、十一、元旦、春节这些节假期都没有去除。这些节假日应该维护成一张表,然后通过查表来去除这 些节假日

    展开全文
  • oracle函数(日期时间表示

    千次阅读 2010-06-09 18:36:00
    oracle函数(日期时间表示

    author:skate

    time:2010-06-09


    oracle函数(日期时间表示)

     

    1. y,yy,yyy,yyyy表示年的最后一位,二位,三位和四位

     

    SQL> select to_char(sysdate,'y') from dual;

    TO_CHAR(SYSDATE,'Y')
    ---------------------------------------------------------------------------
    0

     

    SQL> select to_char(sysdate,'yy') from dual;

    TO_CHAR(SYSDATE,'YY')
    ---------------------------------------------------------------------------
    10

     

    SQL> select to_char(sysdate,'yyy') from dual;

    TO_CHAR(SYSDATE,'YYY')
    ---------------------------------------------------------------------------
    010

     

    SQL> select to_char(sysdate,'yyyy') from dual;

    TO_CHAR(SYSDATE,'YYYY')
    ---------------------------------------------------------------------------
    2010

    SQL>

     

    2. d:一周的第几天;dd:一个月的第几天;ddd:一年的第几天

     

    SQL> select to_char(sysdate,'d') from dual;

    TO_CHAR(SYSDATE,'D')
    ---------------------------------------------------------------------------
    4

     

    SQL> select to_char(sysdate,'dd') from dual;

    TO_CHAR(SYSDATE,'DD')
    ---------------------------------------------------------------------------
    09

     

    SQL> select to_char(sysdate,'ddd') from dual;

    TO_CHAR(SYSDATE,'DDD')
    ---------------------------------------------------------------------------
    160


    3. w:一个月的第几周;ww:一年的第几周


    SQL> select to_char(sysdate,'ww') from dual;

    TO_CHAR(SYSDATE,'WW')
    ---------------------------------------------------------------------------
    23

     

    SQL> select to_char(sysdate,'w') from dual;

    TO_CHAR(SYSDATE,'W')
    ---------------------------------------------------------------------------
    2

     

    SQL>


    4. mm:一年的月份

     

    SQL> select to_char(sysdate,'mm') from dual;

    TO_CHAR(SYSDATE,'MM')
    ---------------------------------------------------------------------------
    06

     

    5. RM: 月份的罗马表示

     

    SQL> select to_char(sysdate,'rm') from dual;

    TO_CHAR(SYSDATE,'RM')
    ---------------------------------------------------------------------------
    vi

     

    SQL>

     

    6. month和mon:月的表示


    SQL> select to_char(sysdate,'month') from dual;

    TO_CHAR(SYSDATE,'MONTH')
    ---------------------------------------------------------------------------
    6月

     

    7. dy和day:表示星期几

     

    SQL> select to_char(sysdate,'dy') from dual;

    TO_CHAR(SYSDATE,'DY')
    ---------------------------------------------------------------------------
    星期三

     

    SQL> select to_char(sysdate,'day') from dual;

    TO_CHAR(SYSDATE,'DAY')
    ---------------------------------------------------------------------------
    星期三

     


    8.时间表示

     

    SQL> select to_char(sysdate,'hh') from dual;

    TO_CHAR(SYSDATE,'HH')
    ---------------------------------------------------------------------------
    05

     

    SQL> select to_char(sysdate,'hh24') from dual;

    TO_CHAR(SYSDATE,'HH24')
    ---------------------------------------------------------------------------
    17

     

    SQL> select to_char(sysdate,'mi') from dual;

    TO_CHAR(SYSDATE,'MI')
    ---------------------------------------------------------------------------
    50

     

    SQL> select to_char(sysdate,'ss') from dual;

    TO_CHAR(SYSDATE,'SS')
    ---------------------------------------------------------------------------
    45

     

    SQL>

     

    9. q:季度的表示


    SQL> select to_char(sysdate,'q') from dual;

    TO_CHAR(SYSDATE,'Q')
    ---------------------------------------------------------------------------
    2

     

    oracle时间相关函数

     

    当前季度的第一天
    SQL> select trunc(sysdate,'q') from dual;

    TRUNC(SYSDATE,'Q')
    ------------------
    2010-4-1

     

    当前周的第一天(周日是第一天)


    SQL> select trunc(sysdate,'d') from dual;

    TRUNC(SYSDATE,'D')
    ------------------
    2010-6-6

     

    当前月的当前日


    SQL> select trunc(sysdate,'dd') from dual;

    TRUNC(SYSDATE,'DD')
    -------------------
    2010-6-9

     

    当前月的最后一天

     

    SQL> select last_day(sysdate) from dual;

    LAST_DAY(SYSDATE)
    -----------------
    2010-6-30 17:54:5

     

    sysdate后推两个月


    SQL> select add_months(sysdate,2) from dual;

    ADD_MONTHS(SYSDATE,2)
    ---------------------
    2010-8-9 17:58:44

     

    next_day(sysdate,2) 日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期

     

    SQL> select next_day(sysdate,2) from dual;

    NEXT_DAY(SYSDATE,2)
    -------------------
    2010-6-14 17:59:37

     

    Months_between(f,s):日期f和s间相差月数


    SQL> select months_between(sysdate,sysdate+1) from dual;

    MONTHS_BETWEEN(SYSDATE,SYSDATE
    ------------------------------
                -0.032258064516129

    SQL>

     

    找出sysdate的指定字段


    SQL> select extract(month from sysdate) from dual;

    EXTRACT(MONTHFROMSYSDATE)
    -------------------------
                            6

    SQL> select extract(year from sysdate) from dual;

    EXTRACT(YEARFROMSYSDATE)
    ------------------------
                        2010

    SQL>

     

    上月末天:

     

    SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;

    LASTDAY
    ---------------------------------------------------------------------------
    2010-05-31

     

    上月今天

     

    SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;

    PRETODAY
    ---------------------------------------------------------------------------
    2010-05-09

     

    上月第一天

     

    SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

    FIRSTDAY
    ---------------------------------------------------------------------------
    2010-05-01


    要找到某月中所有周五的具体日期

     

    SQL> SELECT to_char(b.a,'YY-MM-DD')
      2  FROM ( SELECT trunc(SYSDATE,'mm')+ROWNUM-1 a
      3  FROM dba_objects where rownum < 32 ) b
      4  WHERE to_char(b.a,'day')='星期五'
      5  ;

    TO_CHAR(B.A,'YY-MM-DD')
    ---------------------------------------------------------------------------
    10-06-04
    10-06-11
    10-06-18
    10-06-25

    SQL>

     

     

     

     

    ------end-------

     

     

     

     

     

     

     

    展开全文
  • oracle得到日期

    千次阅读 2014-06-24 10:17:56
    在前篇《Oracle日期类型操作几个问题》中,我们已经了解到date类型的基本知识。date类型是一种包括年、月、日、时、分和秒的数据类型,可以表示相对精确的时间信息。内部存储上,date类型是类似于数字类型的,可以...


    http://www.blogjava.net/gf7/archive/2012/07/01/381933.html

    函数trunc是一个Oracle内置的函数,可以对date类型数据进行“度身裁剪”,来适应不同类型的数据需求。

     

    在前篇《Oracle日期类型操作几个问题》中,我们已经了解到date类型的基本知识。date类型是一种包括年、月、日、时、分和秒的数据类型,可以表示相对精确的时间信息。内部存储上,date类型是类似于数字类型的,可以通过加减操作实现对日期的推进和后退。

     

    但是,日期格式的精确常常给我们带来一些困扰,特别是其中的时分秒信息。很多时候,我们对这部分信息是不需要的。比如指定日期查询、只显示天信息等等。借助To_char虽然可以实现一部分这种需要,但是这样做格式上比较复杂,而且进行了数据类型的转换。是否存在不变化数据类型的方法,对日期型数据进行处理。答案就是trunc函数。

     

    trunc(date)

     

    截断函数trunc的作用就是将日期类型数据按照指定格式截断,返回一个日期变量数据。例如:

     

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

     

    TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

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

    2010-12-10 20:39:58

     

    SQL> select trunc(sysdate) from dual;

     

    TRUNC(SYSDATE)

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

    2010-12-10

     

    SQL> select to_char(trunc(sysdate),'yyyy-mm-dd hh24:mi:ss') from dual;

     

    TO_CHAR(TRUNC(SYSDATE),'YYYY-M

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

    2010-12-10 00:00:00

     

    默认情况下,sysdate函数返回的日期类型数据包括当前的具体时间。通过trunc(date)的处理,直接截取到天信息,返回指定天的零时。

     

    trunc函数还支持一个重载参数,格式字符串:trunc(date,format),用于指定截断的位置。如下:

     

    //截断到年

    SQL> select trunc(sysdate,'yyyy') from dual;

     

    TRUNC(SYSDATE,'YYYY')

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

    2010-1-1

    //截断到月

    SQL> select trunc(sysdate,'mm') from dual;

     

    TRUNC(SYSDATE,'MM')

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

    2010-12-1

    //截断到日

    SQL> select trunc(sysdate,'dd') from dual;

     

    TRUNC(SYSDATE,'DD')

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

    2010-12-10

    //截断到小时

    SQL> select trunc(sysdate,'hh24') from dual;

     

    TRUNC(SYSDATE,'HH24')

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

    2010-12-10 20:00:00

    //截断到分钟

    SQL> select trunc(sysdate,'mi') from dual;

     

    TRUNC(SYSDATE,'MI')

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

    2010-12-10 20:52:00

     

    使用不同的格式标志,可以指示不同的截断位置,获取各种零刻时间。

     

     

    格式字符串

    说明

    yyyy或者year

    年度第一天(一月一日零时)

    mm或者month

    月份第一天(一日零时)

    dd或者day

    日期零时(00:00:00)

    小时

    hh或者hh24

    几时整(XX:00:00)

    mi

    几分整(XX:XX:00)

     

    借助trunc函数和日期类型加减处理,我们可以实现一些特殊日期的设置,实现日期功能,使用在例如Job调度方面。

     

    //明天零点

    SQL> select to_char(trunc(sysdate)+1,'yyyy-mm-dd hh24:mi:ss') from dual;

     

    TO_CHAR(TRUNC(SYSDATE)+1,'YYYY

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

    2010-12-11 00:00:00

     

    //当天早上十点

    SQL> select to_char(trunc(sysdate)+10/24,'yyyy-mm-dd hh24:mi:ss') from dual;

     

    TO_CHAR(TRUNC(SYSDATE)+10/24,'

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

    2010-12-10 10:00:00

     

    //当月三号,上午10点半

    SQL> select to_char(trunc(sysdate,'mm')+2+10/24+1/48, 'yyyy-mm-dd hh24:mi:ss') from dual;

    注:trunc(sysdate,'mm')将时间取到当前月的1号零时零分零秒,那么加上2就表示当前月的3好零时零分零秒,再加上'10/24'('10/24'本身表示10个小时)就是表示当月3号的十点零分零秒,再加上'1/48'('1/48'本身表示30分钟)就表示当月3号十点三十分零秒

     

    TO_CHAR(TRUNC(SYSDATE,'MM')+2+

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

    2010-12-03 10:30:00 

     

    较复杂的to_char,trunc更加可以发挥日期类型数值本身的特色和优势,无论是代码整洁度还是处理效率都是值得关注的。

     

    额外多说一句,trunc本身还具有处理数字截断功能,用于截断指定位数的数字类型。

     

    //默认截断到整数,不进行四舍五入;

    SQL> select trunc(15.743) from dual;

     

    TRUNC(15.743)

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

              15

    //截断到小数点后一位;

    SQL> select trunc(15.793,1) from dual;

     

    TRUNC(15.793,1)

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

              15.7

    //截断到小数点前一位;

    SQL> select trunc(15.793,-1) from dual;

     

    TRUNC(15.793,-1)

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

                 10

     

    trunc对数字和日期类型处理,也折射出日期类型数据和数字之间的间接关系。

     

    原文地址:http://space.itpub.net/17203031/viewspace-681548

     


     trunc不仅可以用来处理日期,还可以用来处理数字

    TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小数点右边第几位,如果是i2是负就是截取小数点左边第几位。

    例如:

     

     
    1. select TRUNC(0.10005767,1) from dual; 
    2.  
    3. TRUNC(0.10005767,1) 1 0.1

    而如果trunc函数没有指定参i2,那么其作用为取整,且取整的时候不会四舍五入

    例如:

     
    1. select TRUNC(2.60005767) from dual; 
    2.  
      TRUNC(2.60005767)

    round函数和trunc函数的区别:

    ROUND(i1,i2)四舍五入,i1四舍五入,如果i2是正保留小数点后i2位。如果是i2是负数,表示保留小数点前面(左边第几位)

    TRUNC(i1,i2)截取i1的i2位而不四舍五入,如果i2是正就截取小数点右边第几位,如果是i2是负就是截取小数点左边第几位。





    说明二

    oracle trunc()函数的用法

    oracle 的常用日期格式字符 与trunc函数2009-09-30 17:47

    oracle 的常用日期格式字符 与trunc函数

    yyyy 年 mm 月 dd 日 hh24 小时 mi 分钟 ss 秒 .sss 毫秒 

    w 表示某月的第几周
    ww 表示某年的第几周

    如果要截取某个时间的某部分时间,可以使用如下函数:
    trunc( sysdate,'hh24')    得到按小时取整的时间,该时间的分、秒的值为0。其他的同

    例子:统计2008年以来每周执行的语句数。
    select count(*) ,to_char(trunc(start_time,'ww'),'yyyy-ww') stat_time from my_log where start_time>=to_date('2008-1','yyyy-mm') group by trunc(start_time,'ww') order by stat_time

    oracle trunc()函数的用法!2007-04-30 14:22

    ------------------rudy

            关于TRUNC函数的format,自己现在有点体会,format为day时,只精确到天,而不管几年几月只要是符合的day就可以了,要想确定一年中的某月的某一天就要用trunc(date,'dd').

    通俗的说吧,format为年时,精确到-----年

                                 为月时,精确到------年,月(不管哪年,只要是相同的月和哪天)
                                  为日时,精确到------年,月,日(不管哪年的哪月,只关心是哪天)   

    -----------------郁闷.今天才真正明白了.

    1.TRUNC(for dates)
               TRUNC函数为指定元素而截去的日期值。
               其具体的语法格式如下:
               TRUNC(date[,fmt])
               其中:
               date           一个日期值
               fmt                   日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去
               下面是该函数的使用情况:
               TRUNC(TO_DATE(’24-Nov-1999 08:00 pm’,’dd-mon-yyyy hh:mi am’))
                       =’24-Nov-1999 12:00:00 am’
               TRUNC(TO_DATE(’24-Nov-1999 08:37 pm’,’dd-mon-yyyy hh:mi am’,’hh’))           =’24-Nov-1999 08:00:00 am’

    round     (date,'format')未指定format时,如果日期中的时间在中午之前,则将日期中的时间截断为12     A.M.(午夜,一天的开始),否则进到第二天。   

    TRUNC(date,'format')未指定format时,将日期截为12     A.M.,不考虑是否在中午之前的条件。

    2.TRUNC(for number)
               TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。
               其具体的语法格式如下
               TRUNC(number[,decimals])
               其中:
               number           待做截取处理的数值
               decimals           指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分
               下面是该函数的使用情况:
               TRUNC(89.985,2)=89.98
               TRUNC(89.985)=89
               TRUNC(89.985,-1)=80
               注意:第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。

    (在网上找的关于oracle trunc()函数的用法)

    Oracle PL\SQL 操作(三)Oracle函数

    1.系统变量函数

    (1)SYSDATE

    该函数返回当前的日期和时间。返回的是Oracle服务器的当前日期和时间。

    select sysdate  from dual;  insert  into purchase  values (‘Small Widget’,’SH’,sysdate, 10);  insert  into purchase  values (‘Meduem Wodget’,’SH’,sysdate-15, 15);

    查看最近30天的所有销售记录,使用如下命令:

    select *  from purchase  where purchase_date  between (sysdate-30)  and sysdate;

    (2)USER

    查看用户名。

    select  user  from dual;

    (3)USERENV

    查看用户环境的各种资料。

    select userenv(‘TERMINAL’)  FROM dual;

    2.数值函数

    (1)ROUND 四舍五入函数

    ROUND(数值,保留位数)

    select round(3.1415,3)  from deul;  select product_name,round(product_price,0) price  from product;

    (2)TRUNC 从数中截去小数部分

    TRUNC(数值,截断小数点n位后的数)

    select trunc(3.145159,3)  from dual;  select trunc(123456.45,-1)  from dual;  select trunc(123456.45)  from dual;  select product_name,trunc(product_price) price  from product;

    3.文本函数

    (1)UPPER、LOWER和INITCAP

    这三个函数更改提供给它们的文体的大小写。

    select  upper(product_name)  from product;  select  lower(product_name)  from product;  select initcap(product_name)  from product;

    函数INITCAP能够整理杂乱的文本,如下:

    select initcap(‘this  TEXT hAd UNpredictABLE  caSE’)  from dual;

    (2)LENGTH

    求数据库列中的数据所占的长度。

    select product_name,length(product_name) name_length  from product  order  by product_name;

    (3)SUBSTR

    取子串,格式为:

    SUBSTR(源字符串,起始位置,子串长度);

    create  table item_test(item_id  char(20),item_desc  char(25));  insert  into item_test  values(‘LA-101’,’Can, Small’);  insert  into item_test  values(‘LA-102’,’Bottle, Small’);  insert  into item_test  values(‘LA-103’,’Bottle, Large’);

    取编号:

    select substr(item_id,4,3) item_num,item_desc  from item_test;

    (4)INSTR

    确定子串在字符串中的位置,格式如下:

    INSTR(源字符串,要查找的字符串,查找起始位置)

    select instr(‘this  is line one’,’line’,1)  from dual;

    其返回值为子串在源字符串中从起始位置开始第一次出现的位置。上面例子的返回值为9。

    select item_desc , instr(item_desc,’,’,1)  from item_test;

    (5)LTRIM、RTRIM和TRIM

    去除字符串左边的空格、去除字符串右边的空格、去除字符串左右两边的空格。

    select ltrim(‘ abc def ‘)  from dual;

    4.日期函数

    (1)SYSDATE和TRUNC

    这两个函数前面已经出现过,即取Oracle服务器系统的日期和截掉小数部分的功能。观察以下操作:

    create  table test_date (name  varchar2(20), p_date  date);  insert  into test_date  values(‘name1’,sysdate);  select *  from test_date;  select *  from test_date  where p_date=’25-10月-05‘;  select *  from test_date  where trunc(p_date)= ’25-10月-05‘;

    Oracle系统中用SYSDATE取得的不仅包含日期而且还包含的有时间信息,时间信息实际上就是表示儒略日数据中的小数部分。

    (2)ADD_MONTHS

    该函数返回一个具有与所提供日期相差月份的日期,函数中给出了未来或以前的月份数。语法如下:

    ADD_MONTHS(起始日期,增减月数)  select add_months(’26-10月-05‘,2)  from dual;  select add_months(’26-10月-05‘,-2) from dual;

    (3)LAST_DAY

    返回包含给定日期的那个月的最后一天。语法为:

    LAST_DAY(日期)

    select last_day(’21-2月-80‘)  from dual;

    (4)MONTHS_BETWEEN

    返回两个日期间的月份。语法为:

    MONTHS_BETWEEN(较晚日期,较早日期)

    select months_between(’12-10月-05‘,’12-9月-03‘)  from dual;

    5.数据转换函数

    (1)TO_CHAR

    该函数将日期、时间和数值转换为文本。它的主要价值是提供对日期、时间和数的显示控制;该函数的用法非常灵活,使用较复杂,在此我们仅对经常使用的转换举例说明。

    1)格式化日期和时间值

    TO_CHAR(日期数据,格式编码)

    select to_char(sysdate,’YYYY-MM-DD HH24:MI:SS’)  from dual;  select to_char(sysdate,’HH24:MI:SS’)  from dual;  select to_char(sysdate,‘YYYY’)||‘年’|| to_char(sysdate,'MM')||'月'|| to_char(sysdate,'DD')||'日' 日期  from dual

    2)格式化数值

    select to_char(5764.12345,'99,999.9999')  from dual;  select to_char(5764.12345,‘09,999.9999') from dual;

    (2)TO_DATE

    将文本转换为实际的Oracle日期/时间值。格式:

    TO_DATE(文本,日期格式)

    select to_date(‘2005-10-10 11’,’YYYY-MM-DD HH24’)  from dual;  insert  into item_test  values( ‘name-x’, to_date(‘2005-10-25’,’YYYY-MM-DD’) ) ;

    6.其它函数

    NVL函数完成一个简单但有用的功能。任何时候给它一个空值,它都返回一个你所选择的值。格式如下:

    NAL(输入值,如果输入值为空要返回的值)

    select nvl( null,’new_value’)  from dual;  select name,nvl(p_date,sysdate)  from test_date ;

    注意:函数中‘输入值’和‘如果输入值为空要返回的值’的类型必须一致。

       /opt/BOCO.DAL/NPM/common/mbin/invoker/GP-NPM_invoker.pl -o "862" -s "2010-01-18 13:00:00" -e "2010-01-18 14:00:00" -task_id "832793" -table_list "tpd_tkgp"


    2G:
    tpd_msc
    tpd_msc_rb
    tpd_radio_bts(164数据库)
    tpa_radio_sum_t3
    tpd_hlr
    tpd_hlr_rb
    tpd_ggsn
    tpd_sgsn
    tpd_sgsn_rb
    tpd_sdp
    tpd_scp
    tpd_smp
    tpd_smsc_traf
    tpd_smsc_rb
    tpd_tkgp 

    展开全文
  • oracle sql日期比较

    千次阅读 2012-05-18 23:31:50
    第一部分:oracle sql日期比较: oracle sql日期比较: 在今天之前: select * from up_date where update select * from up_date where update 在今天之后: select * from up_date where update > to_date('...

    第一部分:oracle sql日期比较:

    oracle sql日期比较:
    在今天之前:

    select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')
    select * from up_date where update <= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')

    在今天之后:

    select * from up_date where update > to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')
    select * from up_date where update >= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')

    精确时间:

    select * from up_date where update = to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')

    在某段时间内:

    select * from up_date where update between to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')
    select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and update > to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss')
    select * from up_date where update <= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') and update >= to_date('2007-07-07 00:00:00','yyyy-mm-dd hh24:mi:ss')
    格式化日期输出格式:

    to_char(w.sample_time, 'yyyy-mm-dd ')

    第二部分:Oracle 获取当前日期及日期格式


    Oracle 获取当前日期及日期格式

     

       获取系统日期:  SYSDATE()
       格式化日期:     TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS)
                          或 TO_DATE(SYSDATE(),'YY/MM/DD HH24:MI:SS)
       格式化数字:      TO_NUMBER

     

                   注: TO_CHAR  把日期或数字转换为字符串
                                     TO_CHAR(number, '格式')
                                     TO_CHAR(salary, '$99,999.99')
                                     TO_CHAR(date, '格式')


                          TO_DATE  把字符串转换为数据库中的日期类型
                                     TO_DATE(char, '格式')


                          TO_NUMBER  将字符串转换为数字
                                      TO_NUMBER(char, '格式')

     

    返回系统日期,输出 25-12月-09
    select sysdate from dual;
    mi是分钟,输出 2009-12-25 14:23:31
    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;
    mm会显示月份,输出 2009-12-25 14:12:31
    select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;
    输出 09-12-25 14:23:31
    select to_char(sysdate,'yy-mm-dd hh24:mi:ss') from dual 
    输出 2009-12-25 14:23:31

     

    select to_date('2009-12-25 14:23:31','yyyy-mm-dd,hh24:mi:ss') from dual
    而如果把上式写作:
     select to_date('2009-12-25 14:23:31','yyyy-mm-dd,hh:mi:ss') from dual
    则会报错,因为小时hh是12进制,14为非法输入,不能匹配。


    输出 $10,000,00 :
    select to_char(1000000,'$99,999,99') from dual;
    输出 RMB10,000,00 :
    select to_char(1000000,'L99,999,99') from dual;
    输出 1000000.12 :
    select trunc(to_number('1000000.123'),2) from dual;
    select to_number('1000000.123') from dual;


    转换的格式:


    表示 year 的:y 表示年的最后一位 、
                         yy 表示年的最后2位 、
                         yyy 表示年的最后3位 、
                         yyyy 用4位数表示年


    表示month的: mm 用2位数字表示月 、
                           mon 用简写形式, 比如11月或者nov 、
                           month 用全称, 比如11月或者november


    表示day的:dd  表示当月第几天 、
                      ddd 表示当年第几天 、
                      dy  当周第几天,简写, 比如星期五或者fri 、
                      day 当周第几天,全称, 比如星期五或者friday


    表示hour的:hh   2位数表示小时 12进制、
                       hh24 2位数表示小时 24小时


    表示minute的:mi 2位数表示分钟


    表示second的:ss 2位数表示秒 60进制


    表示季度的:q 一位数 表示季度 (1-4)


    另外还有ww 用来表示当年第几周 w用来表示当月第几周。


    24小时制下的时间范围:00:00:00-23:59:59
    12小时制下的时间范围:1:00:00-12:59:59


    数字格式:  9  代表一个数字
                   0  强制显示0
                   $  放置一个$符
                   L  放置一个浮动本地货币符
                   .  显示小数点
                   ,  显示千位指示符


    补充:
    当前时间减去7分钟的时间
    select sysdate,sysdate - interval '7' MINUTE from dual;
    当前时间减去7小时的时间
    select sysdate - interval '7' hour from dual;
    当前时间减去7天的时间
    select sysdate - interval '7' day from dual;
    当前时间减去7月的时间
    select sysdate,sysdate - interval '7' month from dual;
    当前时间减去7年的时间
    select sysdate,sysdate - interval '7' year from dual;
    时间间隔乘以一个数字
    select sysdate,sysdate - 8*interval '7' hour from dual;


    含义解释:
      Dual伪列
          Dual 是 Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的select语句块中。
          不同系统可能返回日期的格式不一样。
          返回当前连接的用户:select user from dual;

     

     

    第四部分:

    Oracle时间函数(转)
    常用的时间格式 在oracle中有 yyyy-mm-dd hh24:mi:ss  而在Java中有些区别 为yyyy-MM-dd HH:mm:ss 这点还是经常容易模糊的。

    相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。

     常用日期型函数
    1。Sysdate 当前日期和时间
    SQL> Select sysdate from dual;

    SYSDATE
    ----------
    21-6月 -05

    2。Last_day 本月最后一天
    SQL> Select last_day(sysdate) from dual;

    LAST_DAY(S
    ----------
    30-6月 -05

    3。Add_months(d,n) 当前日期d后推n个月
    用于从一个日期值增加或减少一些月份
    date_value:=add_months(date_value,number_of_months)

    SQL> Select add_months(sysdate,2) from dual;

    ADD_MONTHS
    ----------
    21-8月 -05

    4。Months_between(f,s) 日期f和s间相差月数
    SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;

    MONTHS_BETWEEN(SYSDATE,TO_DATE('2005-11-12','YYYY-MM-DD'))
    ----------------------------------------------------------
                                                    -4.6966741

    5。NEXT_DAY(d, day_of_week)
    返回由"day_of_week"命名的,在变量"d"指定的日期之后的第一个工作日的日期。参数"day_of_week"必须为该星期中的某一天。
    SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;

    NEXT_DAY(T
    ----------
    26-6月 -05

    6。current_date()返回当前会话时区中的当前日期
    date_value:=current_date
    SQL> column sessiontimezone for a15
    SQL> select sessiontimezone,current_date from dual;

    SESSIONTIMEZONE CURRENT_DA
    --------------- ----------
    +08:00          13-11月-03
     
    SQL> alter session set time_zone='-11:00' 2  /
    会话已更改。
     
    SQL> select sessiontimezone,current_timestamp from dual;

    SESSIONTIMEZONE CURRENT_TIMESTAMP
    --------------- ------------------------------------
    -11:00          12-11月-03 04.59.13.668000 下午 -11:00

    7。current_timestamp()以timestamp with time zone数据类型返回当前会话时区中的当前日期
    SQL> select current_timestamp from dual;

    CURRENT_TIMESTAMP
    ---------------------------------------------------------------------------
    21-6月 -05 10.13.08.220589 上午 +08:00

    8。dbtimezone()返回时区
    SQL> select dbtimezone from dual;

    DBTIME
    ------
    -08:00

    9。extract()找出日期或间隔值的字段值
    date_value:=extract(date_field from [datetime_value|interval_value])
    SQL> select extract(month from sysdate) "This Month" from dual;

    This Month
    ----------
             6

    SQL> select extract(year from add_months(sysdate,36)) " Years" from dual;

         Years
    ----------
          2008

    10。localtimestamp()返回会话中的日期和时间
    SQL> select localtimestamp from dual;

    LOCALTIMESTAMP
    ---------------------------------------------------------------------------
    21-6月 -05 10.18.15.855652 上午

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

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


    现在给出一些实践后的用法:

    1。上月末天:
    SQL> select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from
    dual;

    LASTDAY
    ----------
    2005-05-31

    2。上月今天
    SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;


    PRETODAY
    ----------
    2005-05-21

    3.上月首天
    SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

    FIRSTDAY
    ----------
    2005-05-01

    4.按照每周进行统计
    SQL> select to_char(sysdate,'ww') from dual group by to_char(sysdate,'ww');

    TO
    --
    25

    5。按照每月进行统计
    SQL> select to_char(sysdate,'mm') from dual group by to_char(sysdate,'mm');

    TO
    --
    06

    6。按照每季度进行统计
    SQL> select to_char(sysdate,'q') from dual group by to_char(sysdate,'q');

    T
    -
    2

    7。按照每年进行统计
    SQL> select to_char(sysdate,'yyyy') from dual group by to_char(sysdate,'yyyy');

    TO_C
    ----
    2005

    8.要找到某月中所有周五的具体日期
    select to_char(t.d,'YY-MM-DD') from (
    select trunc(sysdate, 'MM')+rownum-1 as d
    from dba_objects
    where rownum < 32) t
    where to_char(t.d, 'MM') = to_char(sysdate, 'MM') --找出当前月份的周五的日期

    and trim(to_char(t.d, 'Day')) = '星期五'
    --------
    03-05-02
    03-05-09
    03-05-16
    03-05-23
    03-05-30 

    如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中的每周五的日期。

    9.oracle中时间运算

    内容如下:
    1、oracle支持对日期进行运算
    2、日期运算时是以天为单位进行的
    3、当需要以分秒等更小的单位算值时,按时间进制进行转换即可
    4、进行时间进制转换时注意加括号,否则会出问题

    SQL> alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';

    会话已更改。

    SQL> set serverout on
    SQL> declare
      2 DateValue date;
      3 begin
      4 select sysdate into DateValue from dual;
      5 dbms_output.put_line('源时间:'||to_char(DateValue));
      6 dbms_output.put_line('源时间减1天:'||to_char(DateValue-1));
      7 dbms_output.put_line('源时间减1天1小时:'||to_char(DateValue-1-1/24));
      8 dbms_output.put_line('源时间减1天1小时1分:'||to_char(DateValue-1-1/24-1/(24*60)));
      9 dbms_output.put_line('源时间减1天1小时1分1秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*60)));
    10 end;
    11 /
    源时间:2003-12-29 11:53:41
    源时间减1天:2003-12-28 11:53:41
    源时间减1天1小时:2003-12-28 10:53:41
    源时间减1天1小时1分:2003-12-28 10:52:41
    源时间减1天1小时1分1秒:2003-12-28 10:52:40

    PL/SQL 过程已成功完成。


    在Oracle中实现时间相加处理
    -- 名称:Add_Times
    -- 功能:返回d1与NewTime相加以后的结果,实现时间的相加
    -- 说明:对于NewTime中的日期不予考虑
    -- 日期:2004-12-07
    -- 版本:1.0
    -- 作者:Kevin


    create or replace function Add_Times(d1 in date,NewTime in date) return date
    is
      hh   number;
      mm   number;
      ss   number;
      hours number;
      dResult  date; 
    begin
      -- 下面依次取出时、分、秒
      select to_number(to_char(NewTime,'HH24')) into hh from dual;
      select to_number(to_char(NewTime,'MI')) into mm from dual;
      select to_number(to_char(NewTime,'SS')) into ss from dual;
      -- 换算出NewTime中小时总和,在一天的百分几
      hours := (hh + (mm / 60) + (ss / 3600))/ 24;
      -- 得出时间相加后的结果
      select d1 + hours into dResult from dual;
      return(dResult);
    end Add_Times;


    -- 测试用例
    -- select Add_Times(sysdate,to_date('2004-12-06 03:23:00','YYYY-MM-DD HH24:MI:SS')) from dual


    在Oracle9i中计算时间差
    计算时间差是Oracle DATA数据类型的一个常见问题。Oracle支持日期计算,你可以创建诸如“日期1-日期2”这样的表达式来计算这两个日期之间的时间差。
      
     
    一旦你发现了时间差异,你可以使用简单的技巧来以天、小时、分钟或者秒为单位来计算时间差。为了得到数据差,你必须选择合适的时间度量单位,这样就可以进行数据格式隐藏。
     
    使用完善复杂的转换函数来转换日期是一个诱惑,但是你会发现这不是最好的解决方法。
     
    round(to_number(end-date-start_date))- 消逝的时间(以天为单位)
     
    round(to_number(end-date-start_date)*24)- 消逝的时间(以小时为单位)
     
    round(to_number(end-date-start_date)*1440)- 消逝的时间(以分钟为单位)
     
    显示时间差的默认模式是什么?为了找到这个问题的答案,让我们进行一个简单的SQL *Plus查询。
     
    SQL> select sysdate-(sysdate-3) from dual;
     
    SYSDATE-(SYSDATE-3)
    -------------------
                       3 
     
    这里,我们看到了Oracle使用天来作为消逝时间的单位,所以我们可以很容易的使用转换函数来把它转换成小时或者分钟。然而,当分钟数不是一个整数时,我们就会遇到放置小数点的问题。
     
    Select
        (sysdate-(sysdate-3.111))*1440
    from
        dual;
     
    (SYSDATE-(SYSDATE-3.111))*1440
    ------------------------------
                         4479.83333 
     
    当然,我们可以用ROUND函数(即取整函数)来解决这个问题,但是要记住我们必须首先把DATE数据类型转换成NUMBER数据类型。
     
    Select
        round(to_number(sysdate-(sysdate-3.111))*1440)
    from
        dual;
     
    ROUND(TO_NUMBER(SYSDATE-(SYSDATE-3.111))*1440)
    ----------------------------------------------
                                               4480 
     
    我们可以用这些函数把一个消逝时间近似转换成分钟并把这个值写入Oracle表格中。在这个例子里,我们有一个离线(logoff)系统级触发机制来计算已经开始的会话时间并把它放入一个Oracle STATSPACK USER_LOG扩展表格之中。
     
    Update
        perfstat.stats$user_log
    set
        elapsed_minutes =
        round(to_number(logoff_time-logon_time)*1440)
    where
        user = user_id
    and
        elapsed_minutes is NULL;

    查出任一年月所含的工作日
    CREATE OR REPLACE FUNCTION Get_WorkingDays(
      ny IN VARCHAR2
    ) RETURN INTEGER IS
    /*------------------------------------------------------------------------------------------
    函数名称:Get_WorkingDays
    中文名称:求某一年月中共有多少工作日
    作者姓名: XINGPING
    编写时间: 2004-05-22
    输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
    返 回 值:整型值,包含的工作日数目。
    算法描述:
        1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。
        2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模.
        3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。     
    -------------------------------------------------------------------------------------------------*/
      Result INTEGER;
    BEGIN
      SELECT COUNT(*) INTO Result
        FROM (SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday
                FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq
                         FROM (SELECT substr(100+ROWNUM,2,2) dd
                                 FROM ljrq z WHERE Rownum<=31
                              ) t
                         WHERE to_date(ny||t.dd,'yyyymmdd')
                           BETWEEN to_date(ny,'yyyymm')
                               AND last_day(to_date(ny,'yyyymm'))
                     )q
             ) a  
        WHERE a.weekday NOT IN(0,6);   
      RETURN Result; 
    END Get_WorkingDays;

    ______________________________________

    还有一个版本
    CREATE OR REPLACE FUNCTION Get_WorkingDays(
      ny IN VARCHAR2
    ) RETURN INTEGER IS
    /*-----------------------------------------------------------------------------------------
    函数名称:Get_WorkingDays
    中文名称:求某一年月中共有多少工作日
    作者姓名: XINGPING
    编写时间: 2004-05-23
    输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
    返 回 值:整型值,包含的工作日数目。
    算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。     
    ----------------------------------------------------------------------------------------*/
      Result INTEGER := 0;
      myts INTEGER;      --所给年月的天数
      scts INTEGER;      --某天距2001-12-30所差的天数
      rq   DATE;
      djt INTEGER := 1;   --
    BEGIN
      myts := to_char(last_day(to_date(ny,'yyyymm')),'dd'); 
      LOOP
        rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
        scts := rq - to_date('2001-12-30','yyyy-mm-dd');
        IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
          Result := Result + 1;
        END IF;
        djt := djt + 1; 
        EXIT WHEN djt>myts;
      END LOOP; 
      RETURN Result; 
    END Get_WorkingDays;

    以上两个版本的比较

    第一个版本一条SQL语句就可以得出结果,不需要编程就可以达到目的。但需要使用任意一张有权访问的、记录条数至少为31的一张表或视图。
        第二个版本需要编程,但不需要表或者视图。
        这两个版本都还存在需要完善的地方,即没有考虑节日,如五一、十一、元旦、春节这些节假期都没有去除。这些节假日应该维护成一张表,然后通过查表来去除这些节假日。

     

    展开全文
  • Oracle SQL日期比较和常用日期函数

    万次阅读 2016-04-22 09:21:56
    一、oracle sql日期比较 在今天之前:select * from up_date where update to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update to_date('2007-09-07 00:...
  • Oracle日期转换处理

    2017-07-06 19:14:03
    Oracle日期转换处理
  • ORACLE与DB2中都可以用整型(严谨来说是数值型)来表示日期,具体的就是保存具体的天数来保存具体的日期,但是当中的原理是什么捏,待我向大家一一说来:用整型存在ORACLE与DB2的天数值,就是你所存的日期离ORACLE或...
  • oracle日期及时间格式

    2013-12-24 17:36:49
    关于oracle日期时间格式,各位亲了解多少呢,知道rrrr,fm等表示什么?这篇文档将想各位亲具体介绍oracle的各种日期格式,附带试例,赶快下载吧。
  • Oracle TO_DATE 日期格式大全

    万次阅读 多人点赞 2018-02-22 14:52:32
    转自http://apps.hi.baidu.com/share/detail/10070907Oracle TO_DATE 日期格式大全Oracle中TO_DATE格式2009-04-14 10:53TO_DATE格式(以时间:2007-11-02 13:45:25为例) Year: yy two digits 两位年 ...
  • Oracle日期和空值操作

    千次阅读 2020-06-03 16:02:36
    Oracle知识点整理(四)前言日期关键字SYSDATESYSTIMESTAMP日期函数TO_DATETO_CHARLAST_DAYADD_MONTHSMONTHS_BETWEENNEXT_DAYLEAST/GREATEST日期得计算日期RR注意点空值NULL默认值插入NULL修改NULLNULL值的运算操作...
  • Oracle日期函数

    千次阅读 2008-04-29 14:39:00
    Oracle日期函数 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle日期函数会给我们很...
  • oracle日期类型与unix 时间戳的转换, Unix时间戳记是从'1970-01-01 00:00:00'GMT开始的秒数,表现为整数型。 Oracle中的时间是Date型,以下函数提供了两种时间转换的Oracle函数 --unix时间戳与date时间互转 ...
  • ORACLE日期函数

    千次阅读 2013-03-04 10:17:34
    Oracle PL/SQL Oracle日期函数 常用日期型函数 1。Sysdate 当前日期和时间 SQL> Select sysdate from dual; SYSDATE ---------- 21-6月 -05 2。Last_day 本月最后一天 SQL> Select last_day...
  • Oracle获取当前日期日期格式

    万次阅读 2018-05-16 15:16:00
    Oracle 获取当前日期日期格式 获取系统日期: SYSDATE() 格式化日期: TO_CHAR(SYSDATE(),'YY/MM/DD HH24:MI:SS) 或 TO_DATE(SYSDATE(),'YY/MM/DD HH24:MI:SS) 格式化数字: TO_NUMBER 注: ...
  • Oracle 日期类型数据总结

    千次阅读 2019-02-16 13:57:11
    oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTERVAL及TIME ZONE实际用得比较少...DATE表示日期范围可以是公...
  • Oracle日期类型转换格式 将日期型转换成字符串时,可以按新的格式显示。 如格式YYYY-MM-DD HH24:MM:SS表示“年-月-日 小时:分钟:秒”。Oracle日期类型是包含时间在内的。 主要的日期格式字符的含义如下...
  • Oracle 日期函数

    2018-12-18 13:24:38
    表示日期有三种模式: H 日期 + 数字 = H 日期 (若干天后的日期) 日期 - 数字 = 日期 (若干天之前的日期) 日期 - 日期 = 两日期之前相隔的天数 计算当前系统时间十天前的日期 日期 - 日期 ...
  • OracleSQL日期比较和常用日期函数

    千次阅读 2018-06-28 13:53:18
    一、oracle sql日期比较 在今天之前:select * from up_date where update &lt; to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss')select * from up_date where update &lt;= to_date('2007-09-07 00...
  • ORACLE日期数据类型

    万次阅读 2017-10-03 15:28:36
    oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTERVAL及TIME ZONE实际用得比较少,所以...DATE表示日期范围可
  • Oracle日期取整

    2020-10-22 10:43:22
    使用trunc()函数 trunc(sysdate) 表示取今天0点的值 trunc(sysdate - 1)去昨天零点的值
  • Oracle插入日期问题

    千次阅读 2012-02-25 23:36:18
    在网上看见不少oracle新学者对oracle的时间格式很烦,经常是设计了一个带时间字段的表之后,向表插入数据失败。回想起自己刚开始学习oracle时,也对这个时间格式摸不着头脑,虽然是小小的问题,高手们不屑于讨论,但...
  • ORACLE常用日期函数与日期转换格式化函数 Year: yy two digits 两位年 显示值:07 yyy three digits 三位年 显示值:007 yyyy four digits 四位年 显示值:2007 Month: mm number 两位月...
  • 一、oracle sql日期比较 在今天之前:select * from up_date where update to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update to_date('2007-09-07 00:00...
  • Oracle日期处理

    2017-12-29 23:23:26
    日期处理时间日期类型 DATE 日期时间类型,包含的时间部分有年、月、日、时、分、秒,不包含秒的小数位和时区。合法的数据范围是January 1, 4712 BC, to December 31, 9999 AD。默认的格式是通过NLS_ DATE_FORMAT...
  • ORACLE日期函数大全!

    千次阅读 2013-06-04 17:49:46
    日期函数 Oracle PL/SQL Oracle日期函数相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle...
  • oracle日期转换

    2012-04-16 11:25:23
    oracle日期转换 转换函数  与date操作关系最大的就是两个转换函数:to_date(),to_char()  to_date() 作用将字符类型按一定格式转化为日期类型:  具体用法:to_date('2004-11-27','yyyy-mm-dd'),前者为字符串...
  • Oracle数据库里, 可以使用 to_char( 日期, 格式 ) 函数来对日期进行格式化输出. 示例:[/size] [code="sql"]select to_char( sysdate, 'FMyyyy-mm-dd day hh24:mi:ss' ) from dual;[/code][size=...
  • oracle 日期函数

    千次阅读 2008-11-19 16:39:00
    trunc(sysdate,Q) --本季度第一天 trunc(sysdate,D) --本周的第一天(周日) 查询Oracle日期格式 ---------------------------------- select * from... 得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式. PARAMETER VAL
  • Oracle 时间戳转换日期

    2020-12-15 17:56:31
    Oracle 时间戳转换日期 示例 select TO_CHAR(1608025404 / (60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual; 讲解 1608025404 为时间戳 用to...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,125
精华内容 24,850
关键字:

oracle表示日期