oracle中常用的 SQL語句中進行時間加減


一:

numtodsinterval(<x>,<c>) ,x是一個數字,c是一個字符串,
表明x的單位,這個函數把x轉為interval day to second數據類型
常用的單位有 ('day','hour','minute','second')
example
SQL> select sysdate,sysdate+numtodsinterval(3,'hour') as res from dual;
SYSDATE             RES ------------------- -------------------
2007-09-05 01:45:34   2007-09-05 04:45:34
 
numtoyminterval 與numtodsinterval函數類似,將x轉為interval year to month數據類型
常用的單位有'year','month'
example
SQL> select sysdate,sysdate+numtoyminterval(3,'year') as res from dual;
SYSDATE             RES ------------------- -------------------
2007-09-05 01:54:53   2010-09-05 01:54:53

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

格式:NumToYMInterval(n, interval_unit);
n: 數值類型
interval_unit: 'YEAR', 'MONTH' ,或其他可以轉換成這兩個值之一的表達式
 
NumToYMInterval(1, 'YEAR') :一年后的間隔
NumToYMInterval(-1, 'MONTH'): 一個月前
 
小數會被計算成整數后,再做計算:
 
select sysdate + numtoyminterval(0.1, 'MONTH')  as future from dual;\
 
FUTURE
------------------
11-OCT-13
 
該函數的結果是:”INTERVAL YEAR TO MONTH literal“。不能與數值做運算。
select 1 + NumToYMInterval(1, 'MONTH') from dual
Oracle會返回一個錯誤。
 
做日期運算時,這個函數非常有用。例如:取一個月后的日期:
select sysdate + NumToYMInterval(1, 'MONTH') from dual;
 
***********************************************************************************
自己在mybatis的用法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cnpc.oms2.qual.apply.mapper.QualApplyExternalUserMapper">
  <select id="showExternalUser" parameterType="hashmap" resultType="hashmap">
    SELECT exUser.PK_USEREXTEND_CHANGE_ID,
        exUser.EMPLOYEE_ID,
        exUser.ENT_NAME,
        exUser.NAME,
        exUser.SERVER_OILFIELD,
        exUser.REQBOOK_NUM,
        exUser.IS_VALID,
        exUser.BSFLAG,
        exUser.CREATE_USER,
        exUser.UPDATE_USER,
        exUser.CREATE_DATE,
        exUser.UPDATE_DATE,
        exUser.ORG_CODE,
        sysUser.USER_NAME as USER_NAME,
        sysUser.START_DATE+numtodsinterval(sysUser.VALID_DATES,'day') as END_DATE
    FROM QUAL_BASE_USEREXTEND_CHANGE exUser
    LEFT JOIN OMS_SYS_USER sysUser
    ON exUser.EMPLOYEE_ID = sysUser.EMPLOYEE_ID  
    <where>
        <if test="entName !=null and  entName != '' ">  
            exUser.ENT_NAME like CONCAT(CONCAT('%', #{entName}),'%')
        </if>
        <if test="userName !=null and  userName != '' ">  
            AND sysUser.USER_NAME like CONCAT(CONCAT('%', #{userName}),'%')
        </if>
        <if test="loginName !=null and  loginName != '' ">  
            AND exUser.NAME like CONCAT(CONCAT('%', #{loginName}),'%')
        </if>
        
        <if test="reportUnit !=null and  reportUnit != '' ">  
            AND exUser.SERVER_OILFIELD like CONCAT(CONCAT('%', #{reportUnit}),'%')
        </if>
        <if test="reportNum !=null and  reportNum != '' ">  
            AND exUser.REQBOOK_NUM like CONCAT(CONCAT('%', #{reportNum}),'%')
        </if>
        
        <if test="startDate !=null and startDate !=''">  
            AND TO_CHAR(sysUser.START_DATE, 'YYYY-mm-dd') &gt;= #{startDate}
        </if>
        <if test="endDate !=null and endDate !=''">  
            AND TO_CHAR(sysUser.START_DATE+numtodsinterval(sysUser.VALID_DATES,'day'), 'YYYY-mm-dd') &lt;= #{endDate}
        </if>
        AND    
        exUser.ORG_CODE like CONCAT(CONCAT('%', #{orgCode}),'%')
        <if test="entId !=null and entId != '' ">  
            OR a.ENT_ID like CONCAT(CONCAT('%', #{entId}),'%')
        </if>
        AND exUser.BSFLAG = '0' 
    </where>
    ORDER BY 
        <if test="isSort == 'yes'">
              <trim suffixOverrides=",">
                  
              </trim>
          </if> 
          <if  test="isSort == 'no'">
              END_DATE DESC,exUser.ENT_NAME,exUser.NAME,exUser.SERVER_OILFIELD
          </if>  
  </select>
  
</mapper>
***********************************************************************************
 
加法 
select sysdate,add_months(sysdate,12) from dual;         --加1年
select sysdate,add_months(sysdate,1) from dual;         --加1月
select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;    --加1星期
select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;    --加1天
select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1小時
select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1分鍾
select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --加1秒

減法
select sysdate,add_months(sysdate,-12) from dual;         --減1年
select sysdate,add_months(sysdate,-1) from dual;         --減1月
select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;    --減1星期
select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;    --減1天
select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;   --減1小時
select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;   --減1分鍾
select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual; --減1秒
 
 
對當前日期增加一個小時:
SQL> select sysdate, sysdate+numtodsinterval(1,’hour’) from dual ;

SYSDATE             SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:38:19 2010-10-14 22:38:19
對當前日期增加50分種
SQL> select sysdate, sysdate+numtodsinterval(50,’minute’) from dual ;

SYSDATE             SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:39:12 2010-10-14 22:29:12
對當前日期增加45秒
SQL> select sysdate, sysdate+numtodsinterval(45,’second’) from dual ;

SYSDATE             SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:40:06 2010-10-14 21:40:51
對當前日期增加3天
SQL> select sysdate, sysdate+3 from dual ;

SYSDATE             SYSDATE+3
——————- ——————-
2010-10-14 21:40:46 2010-10-17 21:40:46
對當前日期增加4個月
SQL> select sysdate, add_months(sysdate,4) from dual ;

SYSDATE             ADD_MONTHS(SYSDATE,
——————- ——————-
2010-10-14 21:41:43 2011-02-14 21:41:43

當前日期增加2年
SQL> select sysdate, add_months(sysdate,12*2) from dual ;

SYSDATE             ADD_MONTHS(SYSDATE,
——————- ——————-
2010-10-14 21:42:17 2012-10-14 21:42:17

timestamp的操作方法與上面類似;
求兩個日期之差:
例:求2007-5-23 21:23:34與當前時間之間的差值。
SQL> select sysdate-to_date(’20070523 21:23:34′,’yyyy-mm-dd hh24:mi:ss’) dt from
dual ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM