在oracle中处理日期大全

Sql代码 复制代码
  1.        
  2.        
  3.       TO_DATE格式          
  4.   Day:          
  5.   dd   number   12          
  6.   dy   abbreviated   fri          
  7.   day   spelled   out   friday          
  8.   ddspth   spelled   out,   ordinal   twelfth          
  9.   Month:          
  10.   mm   number   03          
  11.   mon   abbreviated   mar          
  12.   month   spelled   out   march          
  13.   Year:          
  14.   yy   two   digits   98          
  15.   yyyy   four   digits   1998          
  16.        
  17.   24小时格式下时间范围为:   0:00:00   -   23:59:59....          
  18.   12小时格式下时间范围为:   1:00:00   -   12:59:59   ....          
  19.   1.          
  20.   日期和字符转换函数用法(to_date,to_char)          
  21.        
  22.   2.          
  23.   select   to_char(   to_date(222,'J'),'Jsp')   from   dual          
  24.        
  25.   显示Two   Hundred   Twenty-Two          
  26.        
  27.   3.          
  28.   求某天是星期几          
  29.   select   to_char(to_date('2002-08-26','yyyy-mm-dd'),'day')   from   dual;          
  30.   星期一          
  31.   select   to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE   =   American')   from   dual;          
  32.   monday          
  33.   设置日期语言          
  34.   ALTER   SESSION   SET   NLS_DATE_LANGUAGE='AMERICAN';          
  35.   也可以这样          
  36.   TO_DATE   ('2002-08-26',   'YYYY-mm-dd',   'NLS_DATE_LANGUAGE   =   American')          
  37.        
  38.   4.          
  39.   两个日期间的天数          
  40.   select   floor(sysdate   -   to_date('20020405','yyyymmdd'))   from   dual;          
  41.        
  42.   5.   时间为null的用法          
  43.   select   id,   active_date   from   table1          
  44.   UNION          
  45.   select   1,   TO_DATE(null)   from   dual;          
  46.        
  47.   注意要用TO_DATE(null)          
  48.        
  49.   6.          
  50.   a_date   between   to_date('20011201','yyyymmdd')   and   to_date('20011231','yyyymmdd')          
  51.   那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。          
  52.   所以,当时间需要精确的时候,觉得to_char还是必要的          
  53.   7.   日期格式冲突问题          
  54.   输入的格式要看你安装的ORACLE字符集的类型,   比如:   US7ASCII,   date格式的类型就是:   '01-Jan-01'          
  55.   alter   system   set   NLS_DATE_LANGUAGE   =   American          
  56.   alter   session   set   NLS_DATE_LANGUAGE   =   American          
  57.   或者在to_date中写          
  58.   select   to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE   =   American')   from   dual;          
  59.   注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,          
  60.   可查看          
  61.   select   *   from   nls_session_parameters          
  62.   select   *   from   V$NLS_PARAMETERS          
  63.        
  64.   8.          
  65.   select   count(*)          
  66.   from   (   select   rownum-1   rnum          
  67.   from   all_objects          
  68.   where   rownum   <=   to_date('2002-02-28','yyyy-mm-dd')   -   to_date('2002-          
  69.   02-01','yyyy-mm-dd')+1          
  70.   )          
  71.   where   to_char(   to_date('2002-02-01','yyyy-mm-dd')+rnum-1,   'D'   )          
  72.   not          
  73.   in   (   '1',   '7'   )          
  74.        
  75.   查找2002-02-28至2002-02-01间除星期一和七的天数          
  76.   在前后分别调用DBMS_UTILITY.GET_TIME,   让后将结果相减(得到的是1/100秒,   而不是毫秒).          
  77.        
  78.   9.          
  79.   select   months_between(to_date('01-31-1999','MM-DD-YYYY'),          
  80.   to_date('12-31-1998','MM-DD-YYYY'))   "MONTHS"   FROM   DUAL;          
  81.   1          
  82.        
  83.   select   months_between(to_date('02-01-1999','MM-DD-YYYY'),          
  84.   to_date('12-31-1998','MM-DD-YYYY'))   "MONTHS"   FROM   DUAL;          
  85.        
  86.   1.03225806451613          
  87.   10.   Next_day的用法          
  88.   Next_day(date,   day)          
  89.        
  90.   Monday-Sunday,   for   format   code   DAY          
  91.   Mon-Sun,   for   format   code   DY          
  92.   1-7,   for   format   code   D          
  93.        
  94.   11          
  95.   select   to_char(sysdate,'hh:mi:ss')   TIME   from   all_objects          
  96.   注意:第一条记录的TIME   与最后一行是一样的          
  97.   可以建立一个函数来处理这个问题          
  98.   create   or   replace   function   sys_date   return   date   is          
  99.   begin          
  100.   return   sysdate;          
  101.   end;          
  102.        
  103.   select   to_char(sys_date,'hh:mi:ss')   from   all_objects;          
  104.   12.          
  105.   获得小时数          
  106.        
  107.   SELECT   EXTRACT(HOUR   FROM   TIMESTAMP   '2001-02-16   2:38:40')   from   offer          
  108.   SQL>   select   sysdate   ,to_char(sysdate,'hh')   from   dual;          
  109.        
  110.   SYSDATE   TO_CHAR(SYSDATE,'HH')          
  111.   --------------------   ---------------------          
  112.   2003-10-13   19:35:21   07          
  113.        
  114.   SQL>   select   sysdate   ,to_char(sysdate,'hh24')   from   dual;          
  115.        
  116.   SYSDATE   TO_CHAR(SYSDATE,'HH24')          
  117.   --------------------   -----------------------          
  118.   2003-10-13   19:35:21   19          
  119.        
  120.   获取年月日与此类似          
  121.   13.          
  122.   年月日的处理          
  123.   select   older_date,          
  124.   newer_date,          
  125.   years,          
  126.   months,          
  127.   abs(          
  128.   trunc(          
  129.   newer_date-          
  130.   add_months(   older_date,years*12+months   )          
  131.   )          
  132.   )   days          
  133.   from   (   select          
  134.   trunc(months_between(   newer_date,   older_date   )/12)   YEARS,          
  135.   mod(trunc(months_between(   newer_date,   older_date   )),          
  136.   12   )   MONTHS,          
  137.   newer_date,          
  138.   older_date          
  139.   from   (   select   hiredate   older_date,          
  140.   add_months(hiredate,rownum)+rownum   newer_date          
  141.   from   emp   )          
  142.   )          
  143.        
  144.   14.          
  145.   处理月份天数不定的办法          
  146.   select   to_char(add_months(last_day(sysdate)   +1,   -2),   'yyyymmdd'),last_day(sysdate)   from   dual          
  147.        
  148.   16.          
  149.   找出今年的天数          
  150.   select   add_months(trunc(sysdate,'year'),   12)   -   trunc(sysdate,'year')   from   dual          
  151.        
  152.   闰年的处理方法          
  153.   to_char(   last_day(   to_date('02'   ||   :year,'mmyyyy')   ),   'dd'   )          
  154.   如果是28就不是闰年          
  155.        
  156.   17.          
  157.   yyyy与rrrr的区别          
  158.   'YYYY99   TO_C          
  159.   -------   ----          
  160.   yyyy   99   0099          
  161.   rrrr   99   1999          
  162.   yyyy   01   0001          
  163.   rrrr   01   2001          
  164.        
  165.   18.不同时区的处理          
  166.   select   to_char(   NEW_TIME(   sysdate,   'GMT','EST'),   'dd/mm/yyyy   hh:mi:ss')   ,sysdate          
  167.   from   dual;          
  168.        
  169.   19.          
  170.   5秒钟一个间隔          
  171.   Select   TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300)   *   300,'SSSSS')   ,TO_CHAR(sysdate,'SSSSS')          
  172.   from   dual          
  173.        
  174.   2002-11-1   9:55:00   35786          
  175.   SSSSS表示5位秒数          
  176.        
  177.   20.          
  178.   一年的第几天          
  179.   select   TO_CHAR(SYSDATE,'DDD'),sysdate   from   dual          
  180.   310   2002-11-6   10:03:51          
  181.        
  182.   21.计算小时,分,秒,毫秒          
  183.   select          
  184.   Days,          
  185.   A,          
  186.   TRUNC(A*24)   Hours,          
  187.   TRUNC(A*24*60   -   60*TRUNC(A*24))   Minutes,          
  188.   TRUNC(A*24*60*60   -   60*TRUNC(A*24*60))   Seconds,          
  189.   TRUNC(A*24*60*60*100   -   100*TRUNC(A*24*60*60))   mSeconds          
  190.   from          
  191.   (          
  192.   select          
  193.   trunc(sysdate)   Days,          
  194.   sysdate   -   trunc(sysdate)   A          
  195.   from   dual          
  196.   )          
  197.        
  198.   select   *   from   tabname          
  199.   order   by   decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');          
  200.        
  201.   //          
  202.   floor((date2-date1)   /365)   作为年          
  203.   floor((date2-date1,   365)   /30)   作为月          
  204.   mod(mod(date2-date1,   365),   30)作为日.          
  205.   23.next_day函数          
  206.   next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。          
  207.   1   2   3   4   5   6   7          
  208.   日   一   二   三   四   五   六      
  209. 在论坛中常常看到有对oracle中时间运算提问的问题,今天有时间,看了看以前各位兄弟的贴子,整理了一下,并作了个示例,希望会对大家有帮助。        
  210.   首先感谢ern、eric.li及各版主还有热心的兄弟们        
  211.        
  212.   内容如下:        
  213.   1、oracle支持对日期进行运算        
  214.   2、日期运算时是以天为单位进行的        
  215.   3、当需要以分秒等更小的单位算值时,按时间进制进行转换即可        
  216.   4、进行时间进制转换时注意加括号(见示例中红色括号),否则会出问题        
  217.        
  218.   SQL>   alter   session   set   nls_date_format='yyyy-mm-dd   hh:mi:ss';        
  219.        
  220.   会话已更改。        
  221.        
  222.   SQL>   set   serverout   on        
  223.   SQL>   declare        
  224.       2   DateValue   date;        
  225.       3   begin        
  226.       4   select   sysdate   into   DateValue   from   dual;        
  227.       5   dbms_output.put_line('源时间:'||to_char(DateValue));        
  228.       6   dbms_output.put_line('源时间减1天:'||to_char(DateValue-1));        
  229.       7   dbms_output.put_line('源时间减1天1小时:'||to_char(DateValue-1-1/24));        
  230.       8   dbms_output.put_line('源时间减1天1小时1分:'||to_char(DateValue-1-1/24-1/(24*60)));        
  231.       9   dbms_output.put_line('源时间减1天1小时1分1秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*6        
  232.   0)));        
  233.   10   end;        
  234.   11   /        
  235.   源时间:2003-12-29   11:53:41        
  236.   源时间减1天:2003-12-28   11:53:41        
  237.   源时间减1天1小时:2003-12-28   10:53:41        
  238.   源时间减1天1小时1分:2003-12-28   10:52:41        
  239.   源时间减1天1小时1分1秒:2003-12-28   10:52:40        
  240.        
  241.   PL/SQL   过程已成功完成。        
  242.        
  243.   SQL>    
  244.   
  245. 查看server端的字符集:   
  246. select * from V$NLS_PARAMETERS   
  247.     parameter value   
  248.     NLS_LANGUAGE SIMPLIFIED CHINESE   
  249.     NLS_TERRITORY CHINA   
  250.     …. ….   
  251.     NLS_CHARACTERSET WE8MSWIN1252   
  252.     NLS_SORT BINARY  
  253.     
  254. Oracle通过NLS_LANG来设置客户端的情况,NLS_LANG由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>   
  255. 打开注册表:HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE   
  256. 修改注册表下nls_lang键值(包括oracle下的、ID0下的和HOME0下的nls_lang都修改了)   
  257. 将NLS_LANG的键值设为:SIMPLIFIED CHINESE_CHINA.WE8MSWIN1252   
  258. 再往数据库中插入汉字就ok了。。。   
  259.   
  260. 查看表的建表记录   
  261.   SELECT   OBJECT_NAME,    --对象名     
  262.  OBJECT_TYPE,    --对象类型     
  263.  TO_CHAR(CREATED,   'YYYY-Mon-DD   HH24:MI')   CREATE_TIME, --创建时间     
  264.  TO_CHAR(LAST_DDL_TIME,   'YYYY-Mon-DD   HH24:MI')   MOD_TIME,     --修改时间   
  265.  TIMESTAMP,                  --时间戳     
  266.  STATUS                    --状态     
  267.  FROM   USER_OBJECTS     
  268.  WHERE   to_char(LAST_DDL_TIME,'yyyymmdd')>'20070202';   
  269.   
  270. 从字符串中选择出数字   
  271. --方法一:translate函数   
  272. select translate('23456中国3-00=.,45','0123456789'||'23456中国3-00=.,45','0123456789'from dual;   
  273.   
  274. --方法二:自定义函数。   
  275. create or replace function f_filter_str(var_str varcharreturn varchar  
  276. is  
  277. var_str_new varchar2(2000);   
  278. begin  
  279. for i in 1..length(var_str) loop   
  280. if ascii(substr(var_str,i,1))>=48 and ascii(substr(var_str,i,1))<=57 then  
  281. var_str_new := var_str_new || substr(var_str,i,1);   
  282. end if;   
  283. end loop;   
  284. return var_str_new;   
  285. end f_filter_str;   
  286. /   
  287.   
  288. select f_filter_str('23456中国3-00=.,45'from dual;   
  289.   
  290. --方法三:正则表达式   
  291. --oracle10g以上版本   
  292.   
  293. select regexp_replace('23456中国3-00=.,45','[^0-9]'from dual;   
  294. 结果:   
  295. 2345630045   
  296. select regexp_substr(regexp_replace('ASD45XXGG31KK/22','[^0-9]+','-'),'([0-9]+-?)+'from dual;   
  297. 结果:   
  298. 45-31-22   
  299. 结果:  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值