﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-记录点滴-随笔分类-oracle</title><link>http://www.blogjava.net/397879213/category/47475.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 04 May 2012 05:15:30 GMT</lastBuildDate><pubDate>Fri, 04 May 2012 05:15:30 GMT</pubDate><ttl>60</ttl><item><title>Oracle修改时间报:ORA-01830: 日期格式图片在转换整个输入字符串之前结束的解决办法</title><link>http://www.blogjava.net/397879213/archive/2012/05/04/341925.html</link><dc:creator>liuliang</dc:creator><author>liuliang</author><pubDate>Fri, 04 May 2012 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/397879213/archive/2012/05/04/341925.html</guid><wfw:comment>http://www.blogjava.net/397879213/comments/341925.html</wfw:comment><comments>http://www.blogjava.net/397879213/archive/2012/05/04/341925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/397879213/comments/commentRss/341925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/397879213/services/trackbacks/341925.html</trackback:ping><description><![CDATA[<p>1、错误原因： <br />date类型不能包含秒以后的精度。 <br />如日期：2010-01-01 20:02:20.0 </p>
<p>解决方法：将日期秒以后的精度去除 <br />如日期：2010-01-01 20:02:20</p>
<p>2、INSERT INTO TEST2 (C1, C2,c3) VALUES (${v1},${v2},to_date(${v3},'yyyy-mm-dd'));<br />oracle里面不需要以&#8220;；&#8221;结尾。</p>
<p><br />3、修改数据库日期格式：<br />alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</p>
<p>这个命令的适用范围，是修改当前SESSION，另外这不能修改第三方工具的日期格式，如：PL/SQL DEVELOPER需要在Tools-&gt;Preferences-&gt;User Interface-&gt;Date/Time下修改格式即可，第三方工具的日期格式在工具内部自己去设置，我估计你也应该在第三方工具下才会看到这样的效果，一般默认情况下ORACLE默认的日期格式不是这样的。</p>
<p>在默认的sqlplus或者sqlplusw下或者程序编写过程中，执行该命令后，如果是同一个session是肯定会产生你要的效果。</p>
<p>如果要将整体的数据库级别默认格式改掉需要修改参数文件，并重启数据库才可以，但是这个也改不掉你第三方工具的显示格式，第三方工具只能在工具内部去改，它只能改掉默认的日期格式，第三方工具都是转换后的；但是很多时候容易被工具所忽悠，给人的感觉就是数据库就是这样存储的，其实存储的只有日期格式，没有YYYYMM这些东西，这些东西都是通过算法计算出来的结果，然后根据格式要求进行对应的格式化给看到的这样的效果而已。</p>
<p><br />4、INSERT INTO TEST2 (C1, C2,c3) VALUES ('1',1,to_date('2010-12-27 00:00:00','yyyy-mm-dd'))&nbsp; 不可以<br />INSERT INTO TEST2 (C1, C2,c3) VALUES (1,1,to_date('2010-12-27 00:00:00','yyyy-mm-dd hh24:mi:ss'))&nbsp; 可以<br />to_date是类型转换，不是格式转换，字符串和后面的格式要匹配；to_char才是转成对应格式；</p>
<p><br />oracle日期格式总结在oracle中处理日期大全</p>
<p>TO_DATE格式 <br />Day: <br />dd number 12 <br />dy abbreviated fri <br />day spelled out friday <br />ddspth spelled out, ordinal twelfth <br />Month: <br />mm number 03 <br />mon abbreviated mar <br />month spelled out march <br />Year: <br />yy two digits 98 <br />yyyy four digits 1998</p>
<p>24小时格式下时间范围为： 0:00:00 - 23:59:59.... <br />12小时格式下时间范围为： 1:00:00 - 12:59:59 .... <br />1. <br />日期和字符转换函数用法（to_date,to_char）</p>
<p>2. <br />select to_char( to_date(222,'J'),'Jsp') from dual</p>
<p>显示Two Hundred Twenty-Two</p>
<p>3. <br />求某天是星期几 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; <br />星期一 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; <br />monday <br />设置日期语言 <br />ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; <br />也可以这样 <br />TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')</p>
<p>4. <br />两个日期间的天数 <br />select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;</p>
<p>5. 时间为null的用法 <br />select id, active_date from table1 <br />UNION <br />select 1, TO_DATE(null) from dual;</p>
<p>注意要用TO_DATE(null)</p>
<p>6. <br />a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') <br />那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 <br />所以，当时间需要精确的时候，觉得to_char还是必要的 <br />7. 日期格式冲突问题 <br />输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' <br />alter system set NLS_DATE_LANGUAGE = American <br />alter session set NLS_DATE_LANGUAGE = American <br />或者在to_date中写 <br />select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; <br />注意我这只是举了NLS_DATE_LANGUAGE，当然还有很多， <br />可查看 <br />select * from nls_session_parameters <br />select * from V$NLS_PARAMETERS</p>
<p>8. <br />select count(*) <br />from ( select rownum-1 rnum <br />from all_objects <br />where rownum &lt;= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- <br />02-01','yyyy-mm-dd')+1 <br />) <br />where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) <br />not <br />in ( '1', '7' )</p>
<p>查找2002-02-28至2002-02-01间除星期一和七的天数 <br />在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).</p>
<p>9. <br />select months_between(to_date('01-31-1999','MM-DD-YYYY'), <br />to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL; <br />1</p>
<p>select months_between(to_date('02-01-1999','MM-DD-YYYY'), <br />to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;</p>
<p>1.03225806451613 <br />10. Next_day的用法 <br />Next_day(date, day)</p>
<p>Monday-Sunday, for format code DAY <br />Mon-Sun, for format code DY <br />1-7, for format code D</p>
<p>11 <br />select to_char(sysdate,'hh:mi:ss') TIME from all_objects <br />注意：第一条记录的TIME 与最后一行是一样的 <br />可以建立一个函数来处理这个问题 <br />create or replace function sys_date return date is <br />begin <br />return sysdate; <br />end;</p>
<p>select to_char(sys_date,'hh:mi:ss') from all_objects; <br />12. <br />获得小时数</p>
<p>SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer <br />SQL&gt; select sysdate ,to_char(sysdate,'hh') from dual;</p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH') <br />-------------------- --------------------- <br />2003-10-13 19:35:21 07</p>
<p>SQL&gt; select sysdate ,to_char(sysdate,'hh24') from dual;</p>
<p>SYSDATE TO_CHAR(SYSDATE,'HH24') <br />-------------------- ----------------------- <br />2003-10-13 19:35:21 19</p>
<p>获取年月日与此类似 <br />13. <br />年月日的处理 <br />select older_date, <br />newer_date, <br />years, <br />months, <br />abs( <br />trunc( <br />newer_date- <br />add_months( older_date,years*12+months ) <br />) <br />) days <br />from ( select <br />trunc(months_between( newer_date, older_date )/12) YEARS, <br />mod(trunc(months_between( newer_date, older_date )), <br />12 ) MONTHS, <br />newer_date, <br />older_date <br />from ( select hiredate older_date, <br />add_months(hiredate,rownum)+rownum newer_date <br />from emp ) <br />)</p>
<p>14. <br />处理月份天数不定的办法 <br />select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual</p>
<p>16. <br />找出今年的天数 <br />select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual</p>
<p>闰年的处理方法 <br />to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) <br />如果是28就不是闰年</p>
<p>17. <br />yyyy与rrrr的区别 <br />'YYYY99 TO_C <br />------- ---- <br />yyyy 99 0099 <br />rrrr 99 1999 <br />yyyy 01 0001 <br />rrrr 01 2001</p>
<p>18.不同时区的处理 <br />select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate <br />from dual;</p>
<p>19. <br />5秒钟一个间隔 <br />Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') <br />from dual</p>
<p>2002-11-1 9:55:00 35786 <br />SSSSS表示5位秒数</p>
<p>20. <br />一年的第几天 <br />select TO_CHAR(SYSDATE,'DDD'),sysdate from dual <br />310 2002-11-6 10:03:51</p>
<p>21.计算小时,分,秒,毫秒 <br />select <br />Days, <br />A, <br />TRUNC(A*24) Hours, <br />TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, <br />TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, <br />TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds <br />from <br />( <br />select <br />trunc(sysdate) Days, <br />sysdate - trunc(sysdate) A <br />from dual <br />)</p>
<p><br />select * from tabname <br />order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');</p>
<p>// <br />floor((date2-date1) /365) 作为年 <br />floor((date2-date1, 365) /30) 作为月 <br />mod(mod(date2-date1, 365), 30)作为日. <br />23.next_day函数 <br />next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。 <br />1 2 3 4 5 6 7 <br />日 一 二 三 四 五 六</p>
<p><br />oracle中有很多关于日期的函数</p>
<p>在oracle中有很多关于日期的函数，如： <br />1、add_months()用于从一个日期值增加或减少一些月份 <br />date_value:=add_months(date_value,number_of_months) <br />例： <br />SQL&gt; select add_months(sysdate,12) "Next Year" from dual;</p>
<p>Next Year <br />---------- <br />13-11月-04</p>
<p>SQL&gt; select add_months(sysdate,112) "Last Year" from dual;</p>
<p>Last Year <br />---------- <br />13-3月 -13</p>
<p>SQL&gt;</p>
<p>2、current_date()返回当前会放时区中的当前日期 <br />date_value:=current_date <br />SQL&gt; column sessiontimezone for a15 <br />SQL&gt; select sessiontimezone,current_date from dual;</p>
<p>SESSIONTIMEZONE CURRENT_DA <br />--------------- ---------- <br />+08:00 13-11月-03</p>
<p>SQL&gt; alter session set time_zone='-11:00' <br />2 /</p>
<p>会话已更改。</p>
<p>SQL&gt; select sessiontimezone,current_timestamp from dual;</p>
<p>SESSIONTIMEZONE CURRENT_TIMESTAMP <br />--------------- ------------------------------------ <br />-11:00 12-11月-03 04.59.13.668000 下午 -11: <br />00</p>
<p>SQL&gt;</p>
<p>3、current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期 <br />timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) <br />SQL&gt; column sessiontimezone for a15 <br />SQL&gt; column current_timestamp format a36 <br />SQL&gt; select sessiontimezone,current_timestamp from dual;</p>
<p>SESSIONTIMEZONE CURRENT_TIMESTAMP <br />--------------- ------------------------------------ <br />+08:00 13-11月-03 11.56.28.160000 上午 +08: <br />00</p>
<p>SQL&gt; alter session set time_zone='-11:00' <br />2 /</p>
<p>会话已更改。</p>
<p>SQL&gt; select sessiontimezone,current_timestamp from dual;</p>
<p>SESSIONTIMEZONE CURRENT_TIMESTAMP <br />--------------- ------------------------------------ <br />-11:00 12-11月-03 04.58.00.243000 下午 -11: <br />00</p>
<p>SQL&gt;</p>
<p>4、dbtimezone()返回时区 <br />varchar_value:=dbtimezone <br />SQL&gt; select dbtimezone from dual;</p>
<p>DBTIME <br />------ <br />-07:00</p>
<p>SQL&gt;</p>
<p>5、extract()找出日期或间隔值的字段值 <br />date_value:=extract(date_field from [datetime_value|interval_value]) <br />SQL&gt; select extract(month from sysdate) "This Month" from dual;</p>
<p>This Month <br />---------- <br />11</p>
<p>SQL&gt; select extract(year from add_months(sysdate,36)) "3 Years Out" from dual;</p>
<p>3 Years Out <br />----------- <br />2006</p>
<p>SQL&gt;</p>
<p>6、last_day()返回包含了日期参数的月份的最后一天的日期 <br />date_value:=last_day(date_value) <br />SQL&gt; select last_day(date'2000-02-01') "Leap Yr?" from dual;</p>
<p>Leap Yr? <br />---------- <br />29-2月 -00</p>
<p>SQL&gt; select last_day(sysdate) "Last day of this month" from dual;</p>
<p>Last day o <br />---------- <br />30-11月-03</p>
<p>SQL&gt;</p>
<p>7、localtimestamp()返回会话中的日期和时间 <br />timestamp_value:=localtimestamp <br />SQL&gt; column localtimestamp format a28 <br />SQL&gt; select localtimestamp from dual;</p>
<p>LOCALTIMESTAMP <br />---------------------------- <br />13-11月-03 12.09.15.433000 <br />下午</p>
<p>SQL&gt; select localtimestamp,current_timestamp from dual;</p>
<p>LOCALTIMESTAMP CURRENT_TIMESTAMP <br />---------------------------- ------------------------------------ <br />13-11月-03 12.09.31.006000 13-11月-03 12.09.31.006000 下午 +08: <br />下午 00</p>
<p>SQL&gt; alter session set time_zone='-11:00';</p>
<p>会话已更改。</p>
<p>SQL&gt; select localtimestamp,to_char(sysdate,'DD-MM-YYYY HH:MI:SS AM') "SYSDATE" from dual;</p>
<p>LOCALTIMESTAMP SYSDATE <br />---------------------------- ------------------------ <br />12-11月-03 05.11.31.259000 13-11-2003 12:11:31 下午 <br />下午</p>
<p>SQL&gt;</p>
<p>8、months_between()判断两个日期之间的月份数量 <br />number_value:=months_between(date_value,date_value) <br />SQL&gt; select months_between(sysdate,date'1971-05-18') from dual;</p>
<p>MONTHS_BETWEEN(SYSDATE,DATE'1971-05-18') <br />---------------------------------------- <br />389.855143</p>
<p>SQL&gt; select months_between(sysdate,date'2001-01-01') from dual;</p>
<p>MONTHS_BETWEEN(SYSDATE,DATE'2001-01-01') <br />---------------------------------------- <br />34.4035409</p>
<p>SQL&gt;</p>
<p>9、next_day()给定一个日期值，返回由第二个参数指出的日子第一次出现在的日期值（应返回相应日子的名称字符串）</p>
<p>與周相關日期函數</p>
<p>1.查询某周的第一天<br />select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') last_day<br />from (select substr('2004-32', 1, 4) yy, to_number(substr('2004-32', 6)) ww<br />from dual)</p>
<p>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 dual</p>
<p>select min(v_date) from<br />(select (to_date('200201','yyyymm') + rownum) v_date<br />from all_tables<br />where rownum &lt; 370)<br />where to_char(v_date,'yyyy-iw') = '2002-49'</p>
<p>2.查询某周的最后一天<br />select trunc(decode(ww, 53, to_date(yy || '3112', 'yyyyddmm'), to_date(yy || '-' || to_char(ww * 7), 'yyyy-ddd')), 'd') - 6 first_day<br />from (select substr('2004-33', 1, 4) yy, to_number(substr('2004-33', 6)) ww<br />from dual)</p>
<p>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</p>
<p>select max(v_date) from<br />(select (to_date('200408','yyyymm') + rownum) v_date<br />from all_tables<br />where rownum &lt; 370)<br />where to_char(v_date,'yyyy-iw') = '2004-33'</p>
<p>3.查询某周的日期<br />select min_date, to_char(min_date,'day') day from<br />(select to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd') min_date <br />from all_tables<br />where rownum &lt;= decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365) <br />union</p>
<p>select to_date(substr('2004-33',1,4)-1||<br />decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd') min_date <br />from all_tables <br />where rownum &lt;= 7<br />union</p>
<p>select to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd') min_date <br />from all_tables <br />where rownum &lt;= 7 <br />)<br />where to_char(min_date,'yyyy-iw') ='2004-33'</p>
<p><br />oracle中时间运算</p>
<p>论坛中常常看到有对oracle中时间运算提问的问题，今天有时间，看了看以前各位兄弟的贴子，整理了一下，并作了个示例，希望会对大家有帮助。 <br />首先感谢ern、eric.li及各版主还有热心的兄弟们</p>
<p>内容如下： <br />1、oracle支持对日期进行运算 <br />2、日期运算时是以天为单位进行的 <br />3、当需要以分秒等更小的单位算值时，按时间进制进行转换即可 <br />4、进行时间进制转换时注意加括号（见示例中红色括号），否则会出问题</p>
<p>SQL&gt; alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';</p>
<p>会话已更改。</p>
<p>SQL&gt; set serverout on <br />SQL&gt; declare <br />2 DateValue date; <br />3 begin <br />4 select sysdate into DateValue from dual; <br />5 dbms_output.put_line('源时间:'||to_char(DateValue)); <br />6 dbms_output.put_line('源时间减1天:'||to_char(DateValue-1)); <br />7 dbms_output.put_line('源时间减1天1小时:'||to_char(DateValue-1-1/24)); <br />8 dbms_output.put_line('源时间减1天1小时1分:'||to_char(DateValue-1-1/24-1/(24*60))); <br />9 dbms_output.put_line('源时间减1天1小时1分1秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*6 <br />0))); <br />10 end; <br />11 / <br />源时间:2003-12-29 11:53:41 <br />源时间减1天:2003-12-28 11:53:41 <br />源时间减1天1小时:2003-12-28 10:53:41 <br />源时间减1天1小时1分:2003-12-28 10:52:41 <br />源时间减1天1小时1分1秒:2003-12-28 10:52:40</p>
<p>PL/SQL 过程已成功完成。</p>
<p>&nbsp;</p> <img src ="http://www.blogjava.net/397879213/aggbug/341925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/397879213/" target="_blank">liuliang</a> 2012-05-04 09:41 <a href="http://www.blogjava.net/397879213/archive/2012/05/04/341925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>