精华内容
下载资源
问答
  • oracle sql 计算时间时,日期时间相减乘 24 计算出的结果精度有问题

    oracle sql 计算时间时,日期时间相减乘 24 计算出的结果精度有问题
    在这里插入图片描述

    SELECT 1 FROM DUAL WHERE (TO_DATE(‘2019-02-14 17:00’,‘YYYY-MM-DD HH24:MI’)
    -TO_DATE(‘2019-02-14 16:00’,‘YYYY-MM-DD HH24:MI’))*24 =1;
    SELECT 1 FROM DUAL WHERE (TO_DATE(‘2019-02-14 19:30’,‘YYYY-MM-DD HH24:MI’)
    -TO_DATE(‘2019-02-14 19:00’,‘YYYY-MM-DD HH24:MI’))*24=0.5;
    第一条语句能有结果但是第二条语句 不能有结果 .目前不知道什么问题.

    展开全文
  • ORACLE SQL 日期处理

    千次阅读 2019-04-08 08:39:04
    ORACLE SQL日期处理 Oracle 中的日期型数据实际含有两个值: 日期和时间 日期函数(6个函数) MONTHS_BETWEEN 两个日期相差的月数 ADD_MONTHS 向指定日期中加上若干月数 NEXT_DAY 指定日期的下一个星期 * ...

    ORACLE SQL日期处理

    Oracle 中的日期型数据实际含有两个值: 日期和时间

    日期函数(6个函数)

    • MONTHS_BETWEEN 两个日期相差的月数
    • ADD_MONTHS 向指定日期中加上若干月数
    • NEXT_DAY 指定日期的下一个星期 * 对应的日期
    • LAST_DAY 本月的最后一天
    • ROUND 日期四舍五入
    • TRUNC 日期截断

    注意(日期的数学运算):

    1. 在日期上加上或减去一个数字结果仍为日期。
    2. 两个日期相减返回日期之间相差的天数(日期不允许做加法运算,无意义)。
    3. 可以用数字除24来向日期中加上或减去天数。

    Select MONTHS_BETWEEN (sysdate,to_date('2019-1-1','yyyy-MM-DD')) from dual;
    

    输出:
    在这里插入图片描述

    Select ADD_MONTHS (to_date('2019-1-1','yyyy-MM-DD'),6) from dual;
    

    输出:
    在这里插入图片描述

    Select NEXT_DAY (to_date('2019-3-26','yyyy-MM-DD'),'星期日') from dual;--该星期的星期天是几号
    

    输出:
    在这里插入图片描述

    Select LAST_DAY (to_date('2019-3-26','yyyy-MM-DD')) from dual;--该月最后一天
    

    输出:
    在这里插入图片描述

    Select ROUND(to_date('2019-3-27', 'yyyy-MM-DD'),'MONTH') from dual;--该日四舍五入到月份
    

    输出:
    在这里插入图片描述

    Select ROUND(to_date('2019-3-27', 'yyyy-MM-DD') ,'YEAR') from dual;--该日四舍五入到年份
    

    输出:
    在这里插入图片描述

    Select TRUNC(to_date('2019-3-27', 'yyyy-MM-DD') ,'YEAR') from dual;--截取该月月份
    

    在这里插入图片描述

    Select TRUNC(to_date('2019-3-27', 'yyyy-MM-DD') ,'YEAR') from dual;--截取该年年份
    

    在这里插入图片描述

    Select (sysdate-to_date('2018-01-01','yyyy-MM-DD'))/7 as weeks from dual;--(用现在时间减去2018-1-1得到的时间再除以7(星期)便得到了周数)——(本sysdate时间为2019-3-27)
    

    输出:
    在这里插入图片描述
    如下为常用的时间计算:

    add_months——月份加减
    Select sysdate,add_months(sysdate,5) from dual; --(加5个月)
    Select sysdate,add_months(sysdate,-5) from dual; --(减5个月)
    select sysdate,to_char(sysdate+5,'yyyy-mm-dd HH24:MI:SS') from dual; --(加5天)
    select sysdate,to_char(sysdate-5,'yyyy-mm-dd HH24:MI:SS') from dual; --(减5天) 
    select sysdate,to_char(sysdate-5/24,'yyyy-mm-dd HH24:MI:SS') from dual; --(减5小时) 
    select sysdate,to_char(sysdate-5/24/60,'yyyy-mm-dd HH24:MI:SS') from dual; --(减5分钟 )
    select sysdate,to_char(sysdate-5/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --(减5秒 )
    
    Select to_char(sysdate,'YYYY-MM-DD') from dual;--(年-月-日)
    Select to_char(sysdate,'yyyy') from dual;--(年) 
    Select to_char(sysdate,'Q') from dual;--(季)
    Select to_char(sysdate,'MM') from dual;--(月) 
    Select to_char(sysdate,'DD') from dual;--(日) 
    Select to_char(sysdate,'D') from dual;--(今天是这个星期的第几天"从星期天开始计算")
    Select to_char(sysdate,'DD') from dual;--(今天是这个月的几号)
    Select to_char(sysdate,'DDD') from dual;--(今天是今年的多少天)
    
    展开全文
  • Oracle SQL计算

    千次阅读 2017-03-20 17:02:10
     --NEXT_DAY(xx,2)返回下一个星期一的日期(1表示星期日,2代表星期一)  --to_char(last_day,'IW')当年12月28号为最大周数  select LEVEL,  NEXT_DAY(first_day+(LEVEL-1+ratio)*7,2) week_first_day, ...
    WITH x AS
    
         (select TO_DATE('2015','YYYY') qry_year from dual),
         x0 AS --查询年份的第一天,当年12月28号
         (SELECT TRUNC(qry_year,'YYYY') AS first_day, 
                 to_date(to_char(qry_year,'yyyy')||'-12-28','yyyy-mm-dd') AS last_day
                 FROM x),
         x1 AS --第一天为周几TO_CHAR(xx,'D')返回1-7(周日-周六)
         (select  TO_CHAR(x0.first_day,'D') week_idx from x0) ,
         x2 AS --为了方便计算,改成2-8(周一-周日)
         (select decode(week_idx,'1','8',week_idx) week_idx2 from x1),
         x3 AS --是否多余4天
         (select SIGN(5-week_idx2) flag from x2),
         x4 AS --当-1时,年初几天为第一周,否则为上一年的末周
         (select decode(flag,-1,0,-1) ratio from x3)
         --NEXT_DAY(xx,2)返回下一个星期一的日期(1表示星期日,2代表星期一)
         --to_char(last_day,'IW')当年12月28号为最大周数
         select LEVEL,
                NEXT_DAY(first_day+(LEVEL-1+ratio)*7,2) week_first_day,
                NEXT_DAY(first_day+(LEVEL-1+ratio)*7,2)+6 week_last_day
          from x0 left join x4 on 1=1

           CONNECT BY LEVEL<=to_char(last_day,'IW');

    /*IW是ISO标准周,它的含义是ISO标准周以周别为“主线”,每年最多可以有53个周别,
    但是每年至少要包含52个周别;如果一年当中第52周别之后至当年的12月31日之间,
    还有大于或等于4天的话,则定为当年的第53周,否则剩余这些天数被归为下一年的第1周;
    如果在不足52周别的话,则以下一年的时间来补;每周固定的从周一开始作为本周的第1天,到周日作为本周的第7天;
    比如:在Oracle中 2012年01月01号依然属于IW周别2011年的第52周的第7天。这个用到的比较多*/

    参考http://blog.csdn.net/liangweiwei130/article/details/37930383


    展开全文
  • 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 SQL 获取日期的当月的最后一天

    千次阅读 2019-07-28 18:59:39
    last_day(date1) 可以得到日期date1的该月份的最后一天 例子: select last_day(DATE’2019-06-10’) from dual; --结果:2019/06/30 类型为DATE
  • SQL ORACLE MYSQL 最大连续日期计算

    千次阅读 2017-10-20 15:14:32
    需求:最大连续日期 不知道大家有没有遇到类似这样的问题?如果认为本文校验方法和观点不错的话,记得收藏。 针对目前的最大连续日期,处理的难点如下几个所示:  1.连续性。连续性决定了日期的跳跃和不可以...
  • 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 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 sql 根据年份、周数取日期
  • 毫秒值求 自定义函数解决 两个毫秒类型时间计算毫秒 也可以单独计算当前时间的毫秒值
  • oracle计算两个日期之间时间差值sql

    千次阅读 2015-04-12 19:42:53
    sql Server中有函数DATEDIFF能够比较方便的计算出两个时间点之间的时间差值,但是oracle就没有,需要自己写方法计算,这是比较坑爹的。 自己写了个分享一下 create or replace function datediff(type in varchar2...
  •   1、查询现在时刻 ...SQL 代码 select sysdate from dual  结果:2010-5-13 10:40:26 2、对日期型转换成字符串型,使用to_char函数   rameter Explanation YEAR Year, spel
  • oracle sql 中处理日期大全

    千次阅读 2016-03-16 10:47:20
    oracle中处理日期大全 TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal twelfth Month: mm number 03 mon abbreviated mar
  • Oracle SQL

    千次阅读 2006-10-26 16:38:00
    Oracle SQL关键字: ORACLE的简单介绍 ORACLE公司是一家提供综合技术产品、方案、服务的数据库公司ORACLE数据库设计成可大量存储数据,快速查询数据,保证数据的安全和一致性,跨网络的分布式管理及客户-服务器的...
  • SQL计算时间

    千次阅读 2020-12-31 09:22:33
    释义:DATEDIFF可以计算开始时间与结束时间的时间,结果是天数 栗子: 2,TIMESTAMPDIFF函数 语法:TIMESTAMPDIFF(时间粒度,开始时间,结束时间) 释义:(1)时间粒度参数: 2/SECOND--秒:计算开始...
  • Oracle计算时间

    千次阅读 2012-02-20 19:10:20
    Oracle计算时间是经常用到的。可以使用“日期1-日期2”并加以运算,来获得你要想的时间:天、小时、分钟或者秒。 例如: select TO_DATE('2012-02-20 17:45:04','yyyy-mm-dd hh24:mi:ss')-TO_DATE('2012...
  • 一、需求 三个字段分别表示时间,字段 info 格式为...想求这两个时间的,首先要把 mytime 带上日期,与 mydate 字段拼接,其次将 info 与 拼接后的字段做。 三、代码实现 Oracle SQL语法中两个时间不能直接做...
  • oracle sql语句大全

    千次阅读 多人点赞 2019-08-06 17:16:54
    oracle常用sql语句函数 sql执行顺序 •FROM •WHERE •GROUP BY •HAVING •SELECT •DISTINCT •UNION •ORDER BY 一、Oracle数据库操作 1、创建数据库 create database databasename 2、删除数据库 ...
  • ORACLEsql

    千次阅读 2013-11-19 21:26:12
    自学ORACLE的笔记,希望有所帮助
  • Oracle计算时间函数

    千次阅读 2018-07-27 11:28:55
    Oracle计算时间函数 两个Date类型字段:START_DATE,END_DATE,计算这两个日期的时间 (分别以天,小时,分钟,秒,毫秒): 天: ROUND(TO_NUMBER(END_DATE - START_DATE)) 小时: ROUND(TO_NUMBER(END_...
  • OracleSQL中,如何计算两个日期时间段的交集天数?计算积数时用到的。
  • oracle计算相隔日期的天数

    千次阅读 2018-03-14 10:36:12
    获取共过了多少天,这是原来sql中的写法,报错ROUND(TO_NUMBER (SYSDATE - 1 - MAX_OPER_TIME))round 四舍五入TO_NUMBER 转换为number类型sysdate 获取系统当前时间MAX_OPER_TIME 从数据库查询出来的日期,存储的是...
  • oracle sql函数

    千次阅读 2009-09-04 12:27:00
    ORACLE常用SQL函数2007-06-14 15:561.ASCII 返回与指定的字符对应的十进制数;SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual;2.CHR 给出整数,返回对应的字符;SQL> select chr(54740) ...
  • Oracle 计算时间

    千次阅读 2018-12-06 11:35:00
    Oracle计算时间是经常用到的。可以使用“日期1-日期2”并加以运算,来获得你要想的时间:天、小时、分钟或者秒。 例如: select TO_DATE('2012-02-20 17:45:04','yyyy-mm-dd hh24:mi:ss')-TO_DATE('2012...
  • Oracle计算年龄SQL语句

    千次阅读 2016-11-26 16:01:29
    Oracle中根据生日计算年龄SQL语句?  算法一: select floor(MONTHS_BETWEEN(sysdate,birthday)/12) from dual;--从数据库中取值 select floor(months_between(sysdate, to_date('20141217','yyyy-mm-dd'))/...
  • oracle计算时间,精确到时分秒

    千次阅读 2017-04-13 18:32:41
    首先,如果你的时间类型都是date那么直接相减,不用转换,如果转换的话精确不到时分秒: ...如果不是日期类型,需要先将这两个时间转化为date型,然后在查询即可select (to_date(end,'yyyy-mm-dd hh24:mi:ss')-to
  • SQL中的日期差函数

    千次阅读 2020-01-17 15:29:24
    计算日期之间的天数 select TO_NUMBER((TO_DATE('2019-01-01 19:51:20','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2019-01-05 21:50:20','yyyy-mm-dd hh24:mi:ss'))*24) from dual; 结果:4....
  • Oracle日期计算之INTERVAL

    千次阅读 2011-05-20 19:14:00
    计算月份的时候除了add_months,还可用INTERVAL: Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 Connected as xxpo SQL> SQL> SELECT to_char(SYSDATE,'YYYY/MM/DD HH24:MI:SS')...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,672
精华内容 17,068
关键字:

oraclesql计算日期差