-- --数学函数 1 .绝对值S: select abs ( - 1 ) valueO: select abs ( - 1 ) value from dual 2 .取整(大)S: select ceiling ( - 1.001 ) valueO: select ceil( - 1.001 ) value from dual 3 .取整(小)S: select floor ( - 1.001 ) valueO: select floor ( - 1.001 ) value from dual 4 .取整(截取)S: select cast ( - 1.002 as int ) valueO: select trunc( - 1.002 ) value from dual 5 .四舍五入S: select round ( 1.23456 , 4 ) value 1.23460 O: select round ( 1.23456 , 4 ) value from dual 1.2346 6 .e为底的幂S: select Exp ( 1 ) value 2.7182818284590451 O: select Exp ( 1 ) value from dual 2.71828182 7 .取e为底的对数S: select log ( 2.7182818284590451 ) value 1 O: select ln( 2.7182818284590451 ) value from dual; 1 8 .取10为底对数S: select log10 ( 10 ) value 1 O: select log ( 10 , 10 ) value from dual; 1 9 .取平方S: select SQUARE ( 4 ) value 16 O: select power ( 4 , 2 ) value from dual 16 10 .取平方根S: select SQRT ( 4 ) value 2 O: select SQRT ( 4 ) value from dual 2 11 .求任意数为底的幂S: select power ( 3 , 4 ) value 81 O: select power ( 3 , 4 ) value from dual 81 12 .取随机数S: select rand () valueO: select sys.dbms_random.value( 0 , 1 ) value from dual; 13 .取符号S: select sign ( - 8 ) value - 1 O: select sign ( - 8 ) value from dual - 1 -- --------三角函数相关 14 .圆周率S: SELECT PI () value 3.1415926535897931 O:不知道 15 . sin , cos , tan 参数都以弧度为单位例如: select sin ( PI () / 2 ) value 得到1(SQLServer) 16 . Asin , Acos , Atan ,Atan2 返回弧度 17 .弧度角度互换(SQLServer,Oracle不知道) DEGREES :弧度 - 〉角度 RADIANS :角度 - 〉弧度 -- -------数值间比较 18 . 求集合最大值S: select max (value) value from ( select 1 value union select - 2 value union select 4 value union select 3 value)aO: select greatest( 1 , - 2 , 4 , 3 ) value from dual 19 . 求集合最小值S: select min (value) value from ( select 1 value union select - 2 value union select 4 value union select 3 value)aO: select least( 1 , - 2 , 4 , 3 ) value from dual 20 .如何处理null值(F2中的null以10代替)S: select F1, IsNull (F2, 10 ) value from TblO: select F1,nvl(F2, 10 ) value from Tbl -- ------字符串函数 21 .求字符序号S: select ascii ( ' a ' ) valueO: select ascii ( ' a ' ) value from dual 22 .从序号求字符S: select char ( 97 ) valueO: select chr( 97 ) value from dual 23 .连接S: select ' 11 ' + ' 22 ' + ' 33 ' valueO: select CONCAT( ' 11 ' , ' 22 ' ) || 33 value from dual 23 .子串位置 -- 返回3 S: select CHARINDEX ( ' s ' , ' sdsq ' , 2 ) valueO: select INSTR( ' sdsq ' , ' s ' , 2 ) value from dual 23 .模糊子串的位置 -- 返回2,参数去掉中间%则返回7 // 本文转自 C ++ Builder 研究 - http: // www.ccrun.com / article.asp?i = 996 & d = dwn1rnS: select patindex ( ' %d%q% ' , ' sdsfasdqe ' ) valueO:oracle没发现,但是instr可以通过第四个参数控制出现次数 select INSTR( ' sdsfasdqe ' , ' sd ' , 1 , 2 ) value from dual 返回6 24 .求子串S: select substring ( ' abcd ' , 2 , 2 ) valueO: select substr( ' abcd ' , 2 , 2 ) value from dual 25 .子串代替 返回aijklmnefS: SELECT STUFF ( ' abcdef ' , 2 , 3 , ' ijklmn ' ) valueO: SELECT Replace ( ' abcdef ' , ' bcd ' , ' ijklmn ' ) value from dual 26 .子串全部替换S: Replace O: select Translate( ' fasdbfasegas ' , ' fa ' , ' 我 ' ) value from dual 27 .长度S: len , datalength O:length 28 .大小写转换 lower , upper 29 .单词首字母大写S:没发现O: select INITCAP( ' abcd dsaf df ' ) value from dual 30 .左补空格(LPAD的第一个参数为空格则同space函数)S: select space ( 10 ) + ' abcd ' valueO: select LPAD( ' abcd ' , 14 ) value from dual 31 .右补空格(RPAD的第一个参数为空格则同space函数)S: select ' abcd ' + space ( 10 ) valueO: select RPAD( ' abcd ' , 14 ) value from dual 32 .删除空格S: ltrim , rtrim O: ltrim , rtrim ,trim 33 . 重复字符串S: select REPLICATE ( ' abcd ' , 2 ) valueO:没发现 34 .发音相似性比较(这两个单词返回值一样,发音相同)S: SELECT SOUNDEX ( ' Smith ' ), SOUNDEX ( ' Smythe ' )O: SELECT SOUNDEX ( ' Smith ' ), SOUNDEX ( ' Smythe ' ) from dualSQLServer中用SELECT DIFFERENCE ( ' Smithers ' , ' Smythers ' ) 比较soundex的差返回0 - 4 ,4为同音,1最高 -- ------------日期函数 35 .系统时间S: select getdate () valueO: select sysdate value from dual 36 .前后几日直接与整数相加减 37 .求日期S: select convert ( char ( 10 ), getdate (), 20 ) valueO: select trunc(sysdate) value from dual select to_char(sysdate, ' yyyy-mm-dd ' ) value from dual 38 .求时间S: select convert ( char ( 8 ), getdate (), 108 ) valueO: select to_char(sysdate, ' hh24:mm:ss ' ) value from dual 39 .取日期时间的其他部分S: DATEPART 和 DATENAME 函数 (第一个参数决定)O:to_char函数 第二个参数决定参数 -- -------------------------------下表需要补充 year yy, yyyyquarter qq, q (季度) month mm, m (m O无效)dayofyear dy, y (O表星期) day dd, d (d O无效)week wk, ww (wk O无效)weekday dw (O不清楚)Hour hh,hh12,hh24 (hh12,hh24 S无效)minute mi, n (n O无效)second ss, s (s O无效)millisecond ms (O无效) -- -------------------------------------------- 40 .当月最后一天S:不知道O: select LAST_DAY(sysdate) value from dual 41 .本星期的某一天(比如星期日)S:不知道O: SELECT Next_day(sysdate, 7 ) vaule FROM DUAL; 42 .字符串转时间S:可以直接转或者select cast ( ' 2004-09-08 ' as datetime ) valueO: SELECT To_date( ' 2004-01-05 22:09:38 ' , ' yyyy-mm-dd hh24-mi-ss ' ) vaule FROM DUAL; 43 .求两日期某一部分的差(比如秒)S: select datediff (ss, getdate (), getdate () + 12.3 ) valueO:直接用两个日期相减(比如d1 - d2 = 12.3 ) SELECT (d1 - d2) * 24 * 60 * 60 vaule FROM DUAL; 44 .根据差值求新的日期(比如分钟)S: select dateadd (mi, 8 , getdate ()) valueO: SELECT sysdate + 8 / 60 / 24 vaule FROM DUAL; 45 .求不同时区时间S:不知道O: SELECT New_time(sysdate, ' ydt ' , ' gmt ' ) vaule FROM DUAL; -- ---时区参数,北京在东8区应该是Ydt------- AST ADT 大西洋标准时间BST BDT 白令海标准时间CST CDT 中部标准时间EST EDT 东部标准时间GMT 格林尼治标准时间HST HDT 阿拉斯加—夏威夷标准时间MST MDT 山区标准时间NST 纽芬兰标准时间PST PDT 太平洋标准时间YST YDT YUKON标准时间Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:函数 Oracle Microsoft SQL Server把字符转换为ASCII ASCII ASCII 字串连接 CONCAT (expression + expression)把ASCII转换为字符 CHR CHAR 返回字符串中的开始字符(左起) INSTR CHARINDEX 把字符转换为小写 LOWER LOWER 把字符转换为大写 UPPER UPPER 填充字符串的左边 LPAD N / A清除开始的空白 LTRIM LTRIM 清除尾部的空白 RTRIM RTRIM 字符串中的起始模式(pattern) INSTR PATINDEX 多次重复字符串 RPAD REPLICATE 字符串的语音表示 SOUNDEX SOUNDEX 重复空格的字串 RPAD SPACE 从数字数据转换为字符数据 TO_CHAR STR 子串 SUBSTR SUBSTRING 替换字符 REPLACE STUFF 将字串中的每个词首字母大写 INITCAP N / A翻译字符串 TRANSLATE N / A字符串长度 LENGTH DATELENGTH or LEN 列表中最大的字符串 GREATEST N / A列表中最小的字符串 LEAST N / A如果为NULL则转换字串 NVL ISNULL 日期函数函数 Oracle Microsoft SQL Server日期相加 (date column +/- value) or ADD_MONTHS DATEADD 两个日期的差 (date column +/- value) or MONTHS_BETWEEN DATEDIFF 当前日期和时间 SYSDATE GETDATE ()一个月的最后一天 LAST_DAY N / A时区转换 NEW_TIME N / A日期后的第一个周日 NEXT_DAY N / A代表日期的字符串 TO_CHAR DATENAME 代表日期的整数 TO_NUMBER(TO_CHAR)) DATEPART 日期舍入 ROUND CONVERT 日期截断 TRUNC CONVERT 字符串转换为日期 TO_DATE CONVERT 如果为NULL则转换日期 NVL ISNULL 转换函数函数 Oracle Microsoft SQL Server数字转换为字符 TO_CHAR CONVERT 字符转换为数字 TO_NUMBER CONVERT 日期转换为字符 TO_CHAR CONVERT 字符转换为日期 TO_DATE CONVERT 16进制转换为2进制 HEX_TO_RAW CONVERT 2进制转换为16进制 RAW_TO_HEX CONVERT 其它行级别的函数函数 Oracle Microsoft SQL Server返回第一个非空表达式 DECODE COALESCE 当前序列值 CURRVAL N / A下一个序列值 NEXTVAL N / A如果exp1 = exp2, 返回null DECODE NULLIF 用户登录账号ID数字 UID SUSER_ID 用户登录名 USER SUSER_NAME 用户数据库ID数字 UID USER_ID 用户数据库名 USER USER_NAME 当前用户 CURRENT_USER CURRENT_USER 用户环境(audit trail) USERENV N / A在CONNECT BY子句中的级别 LEVEL N / A合计函数函数 Oracle Microsoft SQL ServerAverage AVG AVG Count COUNT COUNT Maximum MAX MAX Minimum MIN MIN Standard deviation STDDEV STDEV or STDEVP Summation SUM SUM Variance VARIANCE VAR or VARP Oracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域:EXTRACT( YEAR FROM 日期) ORACLE中日期和时间函数汇总(转载) 在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 month spelled out march Year : yy two digits 98 yyyy four digits 1998 24小时格式下时间范围为: 0 : 00 : 00 - 23 : 59 : 59 .... 12小时格式下时间范围为: 1 : 00 : 00 - 12 : 59 : 59 .... 1 . 日期和字符转换函数用法(to_date,to_char) 2 . select to_char( to_date( 222 , ' J ' ), ' Jsp ' ) from dual 显示Two Hundred Twenty - Two 3 . 求某天是星期几 select to_char(to_date( ' 2002-08-26 ' , ' yyyy-mm-dd ' ), ' day ' ) from dual; 星期一 select to_char(to_date( ' 2002-08-26 ' , ' yyyy-mm-dd ' ), ' day ' , ' NLS_DATE_LANGUAGE = American ' ) from dual; monday 设置日期语言 ALTER SESSION SET NLS_DATE_LANGUAGE = ' AMERICAN ' ; 也可以这样 TO_DATE ( ' 2002-08-26 ' , ' YYYY-mm-dd ' , ' NLS_DATE_LANGUAGE = American ' ) 4 . 两个日期间的天数 select floor (sysdate - to_date( ' 20020405 ' , ' yyyymmdd ' )) from dual; 5 . 时间为null的用法 select id, active_date from table1 UNION select 1 , TO_DATE( null ) from dual; 注意要用TO_DATE( null ) 6 . a_date between to_date( ' 20011201 ' , ' yyyymmdd ' ) and to_date( ' 20011231 ' , ' yyyymmdd ' ) 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 所以,当时间需要精确的时候,觉得to_char还是必要的 7 . 日期格式冲突问题 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: ' 01-Jan-01 ' alter system set NLS_DATE_LANGUAGE = American alter session set NLS_DATE_LANGUAGE = American 或者在to_date中写 select to_char(to_date( ' 2002-08-26 ' , ' yyyy-mm-dd ' ), ' day ' , ' NLS_DATE_LANGUAGE = American ' ) from dual; 注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看 select * from nls_session_parameters select * from V$NLS_PARAMETERS 8 . 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 ' ) 查找2002 - 02 - 28至2002 - 02 - 01间除星期一和七的天数 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1 / 100秒, 而不是毫秒). 9 . select months_between(to_date( ' 01-31-1999 ' , ' MM-DD-YYYY ' ), to_date( ' 12-31-1998 ' , ' MM-DD-YYYY ' )) "MONTHS" FROM DUAL; 1 select months_between(to_date( ' 02-01-1999 ' , ' MM-DD-YYYY ' ), to_date( ' 12-31-1998 ' , ' MM-DD-YYYY ' )) "MONTHS" FROM DUAL; 1.03225806451613 10 . Next_day的用法 Next_day(date, day ) Monday - Sunday, for format code DAY Mon - Sun, for format code DY 1 - 7 , for format code D 11 select to_char(sysdate, ' hh:mi:ss ' ) TIME from all_objects 注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题 create or replace function sys_date return date is begin return sysdate; end ; select to_char(sys_date, ' hh:mi:ss ' ) from all_objects; 12 . 获得小时数 SELECT EXTRACT(HOUR FROM TIMESTAMP ' 2001-02-16 2:38:40 ' ) from offer SQL > select sysdate ,to_char(sysdate, ' hh ' ) from dual; SYSDATE TO_CHAR(SYSDATE, ' HH ' ) -- ------------------ --------------------- 2003 - 10 - 13 19 : 35 : 21 07 SQL > select sysdate ,to_char(sysdate, ' hh24 ' ) from dual; SYSDATE TO_CHAR(SYSDATE, ' HH24 ' ) -- ------------------ ----------------------- 2003 - 10 - 13 19 : 35 : 21 19 获取年月日与此类似 13 . 年月日的处理 select older_date, newer_date, years, months, abs ( trunc( newer_date - add_months( older_date,years * 12 + months ) ) ) days from ( select trunc(months_between( newer_date, older_date ) / 12 ) YEARS, mod(trunc(months_between( newer_date, older_date )), 12 ) MONTHS, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum) + rownum newer_date from emp ) ) 14 . 处理月份天数不定的办法 select to_char(add_months(last_day(sysdate) + 1 , - 2 ), ' yyyymmdd ' ),last_day(sysdate) from dual 16 . 找出今年的天数 select add_months(trunc(sysdate, ' year ' ), 12 ) - trunc(sysdate, ' year ' ) from dual 闰年的处理方法 to_char( last_day( to_date( ' 02 ' || : year , ' mmyyyy ' ) ), ' dd ' ) 如果是28就不是闰年 17 . yyyy与rrrr的区别 ' YYYY99 TO_C ------- ---- yyyy 99 0099 rrrr 99 1999 yyyy 01 0001 rrrr 01 2001 18.不同时区的处理 select to_char( NEW_TIME( sysdate, ' GMT ' , ' EST ' ), ' dd / mm / yyyy hh:mi:ss ' ) ,sysdate from dual; 19. 5秒钟一个间隔 Select TO_DATE(FLOOR(TO_CHAR(sysdate, ' SSSSS ' )/300) * 300, ' SSSSS ' ) ,TO_CHAR(sysdate, ' SSSSS ' ) from dual 2002-11-1 9:55:00 35786 SSSSS表示5位秒数 20. 一年的第几天 select TO_CHAR(SYSDATE, ' DDD ' ),sysdate from dual 310 2002-11-6 10:03:51 21.计算小时,分,秒,毫秒 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 * from tabname order by decode(mode, ' FIFO ' ,1,-1)*to_char(rq, ' yyyymmddhh24miss ' ); // floor((date2-date1) /365) 作为年 floor((date2-date1, 365) /30) 作为月 mod(mod(date2-date1, 365), 30)作为日. 23.next_day函数 next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 1 2 3 4 5 6 7 日 一 二 三 四 五 六oracle中有很多关于日期的函数在oracle中有很多关于日期的函数,如: 1、add_months()用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) 例: SQL> select add_months(sysdate,12) "Next Year" from dual; Next Year ---------- 13-11月-04 SQL> select add_months(sysdate,112) "Last Year" from dual; Last Year ---------- 13-3月 -13 SQL> 2、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 SQL> 3、current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期 timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) SQL> column sessiontimezone for a15 SQL> column current_timestamp format a36 SQL> select sessiontimezone,current_timestamp from dual; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ------------------------------------ +08:00 13-11月-03 11.56.28.160000 上午 +08: 00 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.58.00.243000 下午 -11: 00 SQL> 4、dbtimezone()返回时区 varchar_value:=dbtimezone SQL> select dbtimezone from dual; DBTIME ------ -07:00 SQL> 5、extract()找出日期或间隔值的字段值 date_value:=extract(date_field from [datetime_value|interval_value]) SQL> select extract(month from sysdate) "This Month" from dual; This Month ---------- 11 SQL> select extract(year from add_months(sysdate,36)) "3 Years Out" from dual; 3 Years Out ----------- 2006 SQL> 6、last_day()返回包含了日期参数的月份的最后一天的日期 date_value:=last_day(date_value) SQL> select last_day(date ' 2000 - 02 - 01 ' ) "Leap Yr?" from dual; Leap Yr? ---------- 29-2月 -00 SQL> select last_day(sysdate) "Last day of this month" from dual; Last day o ---------- 30-11月-03 SQL> 7、localtimestamp()返回会话中的日期和时间 timestamp_value:=localtimestamp SQL> column localtimestamp format a28 SQL> select localtimestamp from dual; LOCALTIMESTAMP ---------------------------- 13-11月-03 12.09.15.433000 下午 SQL> select localtimestamp,current_timestamp from dual; LOCALTIMESTAMP CURRENT_TIMESTAMP ---------------------------- ------------------------------------ 13-11月-03 12.09.31.006000 13-11月-03 12.09.31.006000 下午 +08: 下午 00 SQL> alter session set time_zone= ' - 11 : 00 ' ; 会话已更改。 SQL> select localtimestamp,to_char(sysdate, ' DD - MM - YYYY HH:MI:SS AM ' ) "SYSDATE" from dual; LOCALTIMESTAMP SYSDATE ---------------------------- ------------------------ 12-11月-03 05.11.31.259000 13-11-2003 12:11:31 下午 下午 SQL> 8、months_between()判断两个日期之间的月份数量 number_value:=months_between(date_value,date_value) SQL> select months_between(sysdate,date ' 1971 - 05 - 18 ' ) from dual; MONTHS_BETWEEN(SYSDATE,DATE ' 1971 - 05 - 18 ' ) ---------------------------------------- 389.855143 SQL> select months_between(sysdate,date ' 2001 - 01 - 01 ' ) from dual; MONTHS_BETWEEN(SYSDATE,DATE ' 2001 - 01 - 01 ' ) ---------------------------------------- 34.4035409 SQL> 9、next_day()给定一个日期值,返回由第二个参数指出的日子第一次出现在的日期值(应返回相应日子的名称字符串)與周相關日期函數1.查询某周的第一天select trunc(decode(ww, 53, to_date(yy || ' 3112 ' , ' yyyyddmm ' ), to_date(yy || ' - ' || to_char(ww * 7), ' yyyy - ddd ' )), ' d ' ) last_dayfrom (select substr( ' 2004 - 32 ' , 1, 4) yy, to_number(substr( ' 2004 - 32 ' , 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 ' )-6 first_day from dualselect 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 dualselect 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 ' oracle中时间运算论坛中常常看到有对oracle中时间运算提问的问题,今天有时间,看了看以前各位兄弟的贴子,整理了一下,并作了个示例,希望会对大家有帮助。 首先感谢ern、eric.li及各版主还有热心的兄弟们 内容如下: 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*6 0))); 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 过程已成功完成。