---------------------oracle 时间运算------------------------------------------------- --两个日期间的天数 SELECT FLOOR(SYSDATE - TO_DATE('20110701', 'yyyymmdd')) FROM DUAL; --查找2002-02-28至2002-02-01间除星期一和七的天数 SELECT COUNT(*) FROM (SELECT ROWNUM - 1 RNUM FROM ALL_OBJECTS WHERE ROWNUM <= TO_DATE('2002-02-28', 'yyyy-mm-dd') - TO_DATE('2002-02-01', 'yyyy-mm-dd') + 1) WHERE TO_CHAR(TO_DATE('2002-02-01', 'yyyy-mm-dd') + RNUM - 1, 'D') NOT IN ('1', '7'); --两个日期间的月数 SELECT MONTHS_BETWEEN(SYSDATE, TO_DATE('05-21-2011', 'MM-DD-YYYY')) "MONTHS" FROM DUAL; SELECT MONTHS_BETWEEN(SYSDATE, DATE '2010-07-07') MONTHS FROM DUAL; --处理月份天数不定的办法 SELECT TO_CHAR(ADD_MONTHS(LAST_DAY(SYSDATE) + 1, -2), 'yyyymmdd'), LAST_DAY(SYSDATE) FROM DUAL; --找出今年的天数 SELECT ADD_MONTHS(TRUNC(SYSDATE, 'year'), 12) - TRUNC(SYSDATE, 'year') FROM DUAL; --闰年的处理方法 ;如果是28就不是闰年 TO_CHAR(LAST_DAY(TO_DATE('02' || :YEAR, 'mmyyyy')), 'dd') --不同时区的处理 SELECT TO_CHAR(NEW_TIME(SYSDATE, 'GMT', 'EST'), 'dd/mm/yyyy hh:mi:ss'), SYSDATE FROM DUAL; --5秒钟一个间隔,SSSSS表示5位秒数 SELECT TO_DATE(FLOOR(TO_CHAR(SYSDATE, 'SSSSS') / 300) * 300, 'SSSSS'), TO_CHAR(SYSDATE, 'SSSSS') FROM DUAL; -- 一年的第几天 SELECT TO_CHAR(SYSDATE, 'DDD'), SYSDATE FROM DUAL; --计算小时,分,秒,毫秒 SELECT DAYS, A, TRUNC(A * 24) HOURS, TRUNC(A * 24 * 60 - 60 * TRUNC(A * 24)) MINUTES, TRUNC(A * 24 * 60 * 60 - 60 * TRUNC(A * 24 * 60)) SECONDS, TRUNC(A * 24 * 60 * 60 * 100 - 100 * TRUNC(A * 24 * 60 * 60)) MSECONDS FROM (SELECT TRUNC(SYSDATE) DAYS, SYSDATE - TRUNC(SYSDATE) A FROM DUAL); SELECT SUBSTR('2004-32', 1, 4) YY, TO_NUMBER(SUBSTR('2004-32', 6)) WW FROM DUAL; --1.查询某周的第一天 SELECT TRUNC(DECODE(WW, 53, TO_DATE(YY || '3112', 'yyyyddmm'), TO_DATE(YY || '-' || TO_CHAR(WW * 7), 'yyyy-ddd')), 'd') LAST_DAY FROM (SELECT SUBSTR('2004-32', 1, 4) YY, TO_NUMBER(SUBSTR('2004-32', 6)) WW FROM DUAL); SELECT TRUNC(TO_DATE(SUBSTR('2011-01', 1, 5) || TO_CHAR((TO_NUMBER(SUBSTR('2011-01', 6))) * 7), 'yyyy-ddd'), 'd') - 6 FIRST_DAY FROM DUAL; SELECT MIN(V_DATE) FROM (SELECT (TO_DATE('200201', 'yyyymm') + ROWNUM) V_DATE FROM ALL_TABLES WHERE ROWNUM < 370) WHERE TO_CHAR(V_DATE, 'yyyy-iw') = '2002-49'; --2.查询某周的最后一天 SELECT TRUNC(DECODE(WW, 53, TO_DATE(YY || '3112', 'yyyyddmm'), TO_DATE(YY || '-' || TO_CHAR(WW * 7), 'yyyy-ddd')), 'd') - 6 FIRST_DAY FROM (SELECT SUBSTR('2004-33', 1, 4) YY, TO_NUMBER(SUBSTR('2004-33', 6)) WW FROM DUAL); SELECT TRUNC(TO_DATE(SUBSTR('2003-01', 1, 5) || TO_CHAR((TO_NUMBER(SUBSTR('2003-01', 6))) * 7), 'yyyy-ddd'), 'd') LAST_DAY FROM DUAL; SELECT MAX(V_DATE) FROM (SELECT (TO_DATE('200408', 'yyyymm') + ROWNUM) V_DATE FROM ALL_TABLES WHERE ROWNUM < 370) WHERE TO_CHAR(V_DATE, 'yyyy-iw') = '2004-33'; --3.查询某周的日期 SELECT MIN_DATE, TO_CHAR(MIN_DATE, 'day') DAY FROM (SELECT TO_DATE(SUBSTR('2004-33', 1, 4) || '001' + ROWNUM - 1, 'yyyyddd') MIN_DATE FROM ALL_TABLES WHERE ROWNUM <= DECODE(MOD(TO_NUMBER(SUBSTR('2004-33', 1, 4)), 4), 0, 366, 365) UNION SELECT TO_DATE(SUBSTR('2004-33', 1, 4) - 1 || DECODE(MOD(TO_NUMBER(SUBSTR('2004-33', 1, 4)) - 1, 4), 0, 359, 358) + ROWNUM, 'yyyyddd') MIN_DATE FROM ALL_TABLES WHERE ROWNUM <= 7 UNION SELECT TO_DATE(SUBSTR('2004-33', 1, 4) + 1 || '001' + ROWNUM - 1, 'yyyyddd') MIN_DATE FROM ALL_TABLES WHERE ROWNUM <= 7) WHERE TO_CHAR(MIN_DATE, 'yyyy-iw') = '2004-33'; ---------------------------转换函数-------------------------------------------------------- to_char() -- to_date() -- to_number('numbervalue') --转换成数值 SELECT to_number('1314') FROM dual; round('numbervalue') --取整函数(四舍五入) Select round(to_number('123.567')) from dual; floor(sysdate - to_date('20110701','yyyymmdd'))