美文网首页
Oracle经典实例——日期处理

Oracle经典实例——日期处理

作者: 梭哈侠 | 来源:发表于2020-04-02 16:44 被阅读0次
    1.判断闰年

    使用LAST_DAY找出2月的最后一天:

    select to_char(last_day(add_months(trunc(sysdate,'y'),1)),'DD') from dual;
    
    2.从给定日期里提取年月日时分秒
    select to_number(to_char(sysdate,'hh24')) hour,
           to_number(to_char(sysdate,'mi')) min, 
           to_number(to_char(sysdate,'ss')) sec,
           to_number(to_char(sysdate,'dd')) day,
           to_number(to_char(sysdate,'mm')) mth,
           to_number(to_char(sysdate,'yyyy')) year
      from dual;
    
    3.计算一个月的第一天和最后一天

    使用TRUNC函数找出当月第一天,并使用LAST_DAY函数找出当月最后一天:

    select trunc(sysdate,'mm') firstdat,
           last_day(sysdate) lastday
       from dual;
    
    4.列出一年中的所有星期五

    使用CONNECT BY递归查询当前年份的每一天,然后调用TO_CHAR函数筛选出星期五对应的日期:

    with x as (
         select trunc(sysdate,'y')+level-1 dy
         from dual connect by level<=add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y')
    )
    select * from x where to_char(dy,'dy')='星期五';
    
    5.找出当前月份第一个和最后一个星期一

    使用NEXT_DAY和LAST_DAY加上一些日期计算技巧:

    select next_day(trunc(sysdate,'mm')-1,'星期一') first_monday,
           next_day(last_day(trunc(sysdate,'mm'))-7,'星期一') last_monday
       from dual;
    

    NEXT_DAY的第二个参数可用数字代替星期几,如1代表星期日,2代表星期一

    6.生成日历

    使用CONNECT BY递归查询当月每一天,再分别拿出当月每一天对应当年的第几周(wk),每一天是星期几(dw),
    当前月份(curr_mth),然后递增dm值,直至月末,最后使用CASE表达式来决定每一天对应的是星期几,对结果
    按照wk组、排序,如下:

    with x as (
         select * from (select to_char(trunc(sysdate,'mm')+level-1,'iw') wk,
                to_char(trunc(sysdate,'mm')+level-1,'dd') dm,
                to_number(to_char(trunc(sysdate,'mm')+level-1,'d')) dw,
                to_char(trunc(sysdate,'mm')+level-1,'mm') curr_mth,
                to_char(sysdate,'mm') mth
            from dual connect by level<=31)
             where curr_mth=mth
    )
    select max(case dw when 2 then dm end) Mo,
           max(case dw when 3 then dm end) Tu,
           max(case dw when 4 then dm end) We,
           max(case dw when 5 then dm end) Th,
           max(case dw when 6 then dm end) Fr,
           max(case dw when 7 then dm end) Sa,
           max(case dw when 1 then dm end) Su       
       from x group by wk order by wk;
    
    7.依据特定时间单位检索数据

    依据指定的月份、星期或其他时间来筛选记录行:

    select emp_name from emp
      where rtrim(to_char(create_time,'month')) in ('february','december')
      or rtrim(to_char(create_time,'day'))='tuesday';
    

    整理自《SQL经典实例》

    相关文章

      网友评论

          本文标题:Oracle经典实例——日期处理

          本文链接:https://www.haomeiwen.com/subject/dynxphtx.html