oracle中24小时的表示方法
来源:优易学  2011-9-28 14:55:53   【优易学:中国教育考试门户网】   资料下载   IT书店

 

 源时间: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;

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训