精华内容
下载资源
问答
  • oracle 过滤法定假期

    2009-07-29 22:21:00
    函数设计思路是: 首先判断哪些假期会在我操作的时间内: 这样的假期必须满足:假期的开始时间比我操作结束时间要早,而且假期的结束时间比我操作开始时间要迟。 在去判断假期里面是否需要修改我操作的开始时间和...

    函数设计思路是:
    首先判断哪些假期会在我操作的时间内:
    这样的假期必须满足:假期的开始时间比我操作结束时间要早,而且假期的结束时间比我操作开始时间要迟。
    在去判断假期里面是否需要修改我操作的开始时间和操作的结束时间(因为此时我只关注是一个时间段)
    如果假期的开始时间早于我操作的开始时间,则修改我操作的开始为假期的操作开始时间。
    如果假期的结束时间晚于我操作的结束时间,则修改我操作的结束时间的假期的操作时间。(实际实现的时候用的假期的开始时间,只是少加了一个事件跨度,效果一样)
    在看我操作期间的跨度了。如果我修改之后的操作开始时间早于一个假期的开始时间,而且我修改之后的结束时间迟于假期结束的时间,则着整个假期,我都得减掉。

     

    我现在这样设计的:
    假期表有三个主要的字段:
    假期开始时间点,假期结束时间点,假期历时时间段。(整个表示都用整形秒来表示,以为系统时间都是整形秒的格式)
    表week_day

    create table WEEK_DAY
    (
      HID    
    NUMBER,            --id
      D_BEGIN DATE,              --假期开始日期格式
      D_END   DATE,              --假期结束日期格式
      H_DESC  NVARCHAR2(100),    --假期名称
      N_BEGIN NUMBER,            --假期开始整形秒格式
      N_END   NUMBER,            --假期结束整形秒格式
      SECS    NUMBER             --假期长度
    )

    假期开始时间     假期结束时间     假期开始整形秒格式 假期结束整形秒格式 假期长度
    2007-1-6    2007-1-8    1168012800    1168185600    172800
    2007-1-13    2007-1-15    1168617600    1168790400    172800
    2007-1-20    2007-1-22    1169222400    1169395200    172800
    2007-1-27    2007-1-29    1169827200    1170000000    172800
    2007-2-3    2007-2-5    1170432000    1170604800    172800
    2007-2-10    2007-2-12    1171036800    1171209600    172800
    2007-2-17    2007-2-19    1171641600    1171814400    172800
    2007-2-24    2007-2-26    1172246400    1172419200    172800
    2007-3-3    2007-3-5    1172851200    1173024000    172800
    2007-3-10    2007-3-12    1173456000    1173628800    172800
    2007-3-17    2007-3-19    1174060800    1174233600    172800
    2007-3-24    2007-3-26    1174665600    1174838400    172800

    过滤假期是通过函数去过滤的。
    create or replace function get_diff(iBegin number,iEnd number)
    --iBegin 操作开始时间  iEnd 操作结束时间
    return number
    as
      args_begin
    number ;--存储 iBegin 临近的假期开始时间
      args_end number ; --存储 iBegin 临近的假期开始时间
      nTbegin number ;--存储游标零时值 开始值
      nTend number;--存储游标零时值 结束值
      nNum number default 0; --存储操作期间块跨越的假期小时总数
      tNum number default 0; --存储操作期间块跨越的假期小时总数
      ret number default 0;
      t_week_day week_day
    %rowtype;

     
    cursor c_week_day is select * from week_day where n_end>iBegin and n_begin<iEnd order by hid;

    begin
      args_begin :
    =iBegin;
      args_end :
    =iEnd;
     
    open c_week_day;
      loop
       
    fetch c_week_day into t_week_day;
       
    EXIT WHEN c_week_day%NOTFOUND;

        nTbegin :
    = t_week_day.n_begin ;
        nTend :
    = t_week_day.n_end;
        tNum :
    = t_week_day.secs;

       
    if  iBegin > nTbegin and iBegin < nTend then
       
    --判断开始 求出确切的开始时间
         args_begin := nTbegin;
       
    end if ;

       
    if iEnd < nTend and iEnd > nTbegin then
       
    --判断结束 求出确切的结束时间
        args_end := nTbegin;
       
    end if ;

       
    if (( args_begin <= nTbegin) and ( nTend <= args_end)) then

       
    --判断是否有中间点
        nNum := nNum + tNum;--注意修改为整形秒的结构
        ret := ret+1;
       
    end if ;

       
    end loop;
     
    close c_week_day;
      dbms_output.put_line(
    '判断开始 求出确切的开始时间??'||args_begin);
      dbms_output.put_line(
    '判断开始 求出确切的结束时间??'||args_end);
      dbms_output.put_line(
    '判断开始 求出确切的间隔假期段数??'||ret);
      dbms_output.put_line(
    '判断开始 求出确切的间隔假期总数数??'||nNum);
    -- ret := args_begin - args_end - nNum;
    return ret;
    end get_diff;

    展开全文
  • 需求:oracle无法使用数据库情况下剔除春节及十月一假期计算工作日差 解决方案: --测试 select FN_DURATION('2021-02-09','2021-03-08') from dual --新建自定义函数 create or replace function FN_DURATION(para...
    需求:oracle无法使用数据库情况下剔除春节及十月一假期计算工作日差
    解决方案:
    --测试
    select FN_DURATION('2021-02-09','2021-03-08') from dual
    
    --新建自定义函数
    create or replace function FN_DURATION(para1 in varchar2, para2 in varchar2) 
    return varchar2 
    as 
    begin
      if TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')<TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  
        then return     TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')))  
        then return  TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') - TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss');
               
      elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))) 
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss'))  ;
              
      elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))) 
        then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss') < TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-2021-02-06)-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;
    
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')))  
        then return   0  ;
              
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
        then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-02-06','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;
    
    
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
        then return   TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;
              
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-03-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')-(TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss'))  ;
    
    
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')) and (TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')  and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')))  
        then return   0  ;
      elsif ((TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  between TO_DATE('2021-10-01','yyyy-MM-dd hh24-mi-ss')   and TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')) and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss') >TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))  
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss')  ;
    
      elsif (TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')>TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss') and TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')>TO_DATE('2021-10-08','yyyy-MM-dd hh24-mi-ss'))   
        then return   TO_DATE(para2,'yyyy-MM-dd hh24-mi-ss')-TO_DATE(para1,'yyyy-MM-dd hh24-mi-ss')  ;     
      end if;
    end FN_DURATION;
    
    --删除自定义函数
    drop function FN_DURATION;
    
    展开全文
  • oracle 自定义方法 判断日期是不是为假期 如果是假期则取下一天 直到工作日爲止
  • 2019年假期数据库。 oracle数据库的建表和插入语句(plsql developer导出的sql)。 包含日期、星期几、是否假期、节假日名称或周末字段。 与百度假期工具核对的结果。
  • 需求:oracle使用数据库剔除假期 解决方案: 1.创建假期工作日表 create table VACATION_WORK_DAY ( id VARCHAR2(10), work_day VARCHAR2(20), code VARCHAR2(10) ) comment on table VACATION_WORK_DAY is '...
    需求:oracle使用数据库剔除假期
    解决方案:
    
    1.创建假期工作日表
    create table VACATION_WORK_DAY
    (
      id       VARCHAR2(10),
      work_day VARCHAR2(20),
      code     VARCHAR2(10)
    )
    comment on table VACATION_WORK_DAY
      is '2021年工作日与节假日';
    -- Add comments to the columns 
    comment on column VACATION_WORK_DAY.id
      is 'ID';
    comment on column VACATION_WORK_DAY.work_day
      is '日期';
    comment on column VACATION_WORK_DAY.code
      is '1:法定假日;0:工作日; 
      
    --oracle自增序列创建
    create sequence VACATION_WORK_DAY_IDSEQ
     increment by 1
     start with 1
     minvalue 1
     maxvalue 999999999;
    
    2.根据节假日进行sql新增数据,日期code为1为法定节假日,0为工作日
      
    insert into VACATION_WORK_DAY (ID, WORK_DAY, CODE)
    values (VACATION_WORK_DAY_IDSEQ.NEXTVAL, '2021-01-01', '0');
     
    insert into VACATION_WORK_DAY (ID, WORK_DAY, CODE)
    values (VACATION_WORK_DAY_IDSEQ.NEXTVAL, '2021-01-02', '1');
    ........
    
    3.创建剔除假期自定义函数
    create or replace function 
      FN_DURATION(p_arrival_time in varchar2, p_submit_time  in varchar2)
      /*
      内容:获取时间差
      创建人:xxxx
      创建时间:2021年2月3日09:51:36
      */
      --返回类型
      return varchar2
      --返回参数
      is
      r_diff_mins     varchar2(100);
      v_holiday_count varchar2(100);
      begin
      --计算到达与提交日期间包含公休天数
      select count(1)
        into v_holiday_count
        from VACATION_WORK_DAY
       where code != 0
         and work_day between p_arrival_time and p_submit_time;
      --计算到达与提交日期间天数   
      select round(count(1) * (1 / 24 / 60), 2)
        into r_diff_mins
        from (select to_char(TO_DATE(p_submit_time, 'yyyy-MM-dd hh24-mi-ss') -
                             (level / 60 / 24),'d') DOW
                from dual
              connect by level <=
                         ceil((TO_DATE(p_submit_time, 'yyyy-MM-dd hh24-mi-ss') -
                              TO_DATE(p_arrival_time, 'yyyy-MM-dd hh24-mi-ss')) * 24 * 60));
      --到达与提交日期间天数 - 到达与提交日期间包含公休、周末天数
      return r_diff_mins - v_holiday_count;
    end FN_DURATION;
    
    --测试自定义函数
    select FN_DURATION('2021-02-01','2021-02-08') from dual
    
    --删除自定义函数
    drop function FN_DURATION;
    
    展开全文
  • oracle

    2012-11-30 20:43:35
    ORACLE日期函数大全! 2009-03-12 14:16:10 日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在...
    ORACLE日期函数大全!
    
    2009-03-12 14:16:10
    日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在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的一张表或视图。
    第二个版本需要编程,但不需要表或者视图。
    这两个版本都还存在需要完善的地方,即没有考虑节日,如五一、十一、元旦、春节这些节假期都没有去除。这些节假日应该维护成一张表,然后通过查表来去除这些节假日。
    展开全文
  • 国庆期间,数据技术嘉年华为读者准备了做题赢门票的活动,10道极富挑战的Oracle/MySQL/PostgreSQL考题,选择任何一种答对7题即可免费获赠大会门票一张,这里公布一下获奖名...
  • ORACLE

    2016-09-13 14:44:00
    日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle...
  • 恩墨课程内测阶段共有630人参与我们的限时优惠活动,目前活动仍在继续,1元即可获得每周更新的《2019云和恩墨大讲堂》,...假期开始了,也许那些比你优秀的人已经开始了旅行,趁现在赶紧给自己充电吧。 https://...
  • 恩墨课程内测阶段共有630人参与我们的限时优惠活动,目前活动仍在继续,1元即可获得每周更新的《2019云和恩墨大讲堂》,以及《Oracle 12C 高手之路》课程,欢迎大...
  • oracle函数 oracle时间函数

    千次阅读 2010-06-08 08:17:00
    oracle函数 关键字: oracle函数 oracle时间函数 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这...
  • 十一假期第二天早晨起床就收到噩耗,邮件提示我的 Oracle Cloud 账号被封。果然 Oracle 终究是不靠谱,我也一直担心免费的服务器哪天就被收回,这下好了,不到一个月就被封了。邮件内容:您的服务已终止您好, xxx ...
  • Oracle时间函数

    2011-09-23 20:35:03
    常用的时间格式 在oracle中有 yyyy-mm-dd hh24:mi:ss 而在Java中有些区别 为yyyy-MM-dd HH:mm:ss 这点还是经常容易模糊的。 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度...
  • with temp as(select 'cust1' cust,1 "雪碧",1 "可口可乐",1 "橙汁",1 "脉动" from dual union allselect 'cust2' cust,1 "雪碧",1 "可口可乐",0 "橙汁",0 "脉动" from dual union allselect 'cust3' cust,0 "雪碧",...
  • Oracle 11G RAC数据库安装(八) ...oracle基本操作手册是作者研一假期oracle基础知识学习的汇总。然后形成体系的总结,一则进行回顾复习,另则便于查询使用。本图文文档亦源于此。阅读Ora...
  • oracle函数

    2009-09-16 23:38:34
    oracle时间函数 相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多...
  • 原文地址:... ...Oracle 11G RAC数据库安装(八) ...概述:写下本文档的初衷和动力,来源于上篇的《oracle基本操作手册》。oracle基本操作手册是作者研一假期oracle基础知识学习的汇总。然...
  • oracle 日期大全

    2012-07-10 10:30:00
    日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Oracle...
  • Oracle 11G RAC集群安装(七) ...oracle基本操作手册是作者研一假期oracle基础知识学习的汇总。然后形成体系的总结,一则进行回顾复习,另则便于查询使用。本图文文档亦源于此。阅读Orac...
  • oracle自定义函数总结

    2012-07-27 13:03:47
    oracle自定义函数的总结,主要对如何定义函数以及使用。
  • ORACLE时间函数

    2013-10-01 16:42:02
    那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。 常用日期型函数 1。Sysdate 当前日期和时间SQL&gt; Select sysdate from dual;SYSDATE----------21-6月 -052。Last_...
  • oracle时间函数

    2011-06-17 14:49:14
    ... Oracle时间函数 ...相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年...那在oracle中应该怎么来写sql语句呢,这个时候Oracle的日期函数会给我们很多帮助。 常用日期型函数 1。Sy...
  • oracle基本操作手册是作者研一假期oracle基础知识学习的汇总。然后形成体系的总结,一则进行回顾复习,另则便于查询使用。本图文文档亦源于此。阅读Oracle RAC安装与使用教程前,笔者先对这篇文章整体构思和形成...
  • ORACLE日期函数浅谈

    2019-05-17 19:05:10
    ORACLE日期函数大全! 日期函数 Oracle PL/SQL Oracle的日期函数相信很多人都有过统计某些数据的经历, 比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。 那在oracle中应该怎么来...
  • oracle sql日期比较

    2018-09-06 13:43:35
    第一部分:oracle sql日期比较: http://www.blogjava.net/forker/archive/2007/09/07/143467.html#Post 第二部分:Oracle 获取当前日期及日期格式 http://blog.sina.com.cn/s/blog_6168ee920100l2ye.html 第三...
  • oracle 日期相关

    2014-05-26 17:38:10
    oracle日期相减 收藏:http://hi.baidu.com/echolovejose/item/2bf4b35af54204cdd2e10c77 --MONTHS_BETWEEN(date2,date1)  给出date2-date1的月份  SQL> select months_between('19-12月-1999','19-3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,129
精华内容 851
关键字:

oracle假期