﻿<?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/lianyeyu/category/31572.html</link><description>先做人，后做事。</description><language>zh-cn</language><lastBuildDate>Sat, 17 May 2008 15:57:15 GMT</lastBuildDate><pubDate>Sat, 17 May 2008 15:57:15 GMT</pubDate><ttl>60</ttl><item><title>Oracle常用日期计算</title><link>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201097.html</link><dc:creator>连夜雨</dc:creator><author>连夜雨</author><pubDate>Sat, 17 May 2008 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201097.html</guid><wfw:comment>http://www.blogjava.net/lianyeyu/comments/201097.html</wfw:comment><comments>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lianyeyu/comments/commentRss/201097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lianyeyu/services/trackbacks/201097.html</trackback:ping><description><![CDATA[先声明一下，是转载的文章，具体出处没有找到，望原创见谅。<br />
<br />
&nbsp;sysdate 为数据库服务器的当前系统时间。 <br />
to_char 是将日期型转为字符型的函数。 <br />
to_date 是将字符型转为日期型的函数，一般使用 yyyy-mm-dd hh24:mi:ss格式，当没有指定时间部分时，则默认时间为 00:00:00 <br />
<br />
dual 表为sys用户的表，这个表仅有一条记录，可以用于计算一些表达式，如果有好事者用 sys 用户登录系统，然后在 dual 表增加了记录的话，那么系统99.999%不能使用了。为什么使用的时候不用 sys.dual 格式呢，因为 sys 已经为 dual 表建立了所有用户均可使用的别名。 <br />
<br />
<br />
一年的第一天 <br />
<br />
SELECT to_date(to_char(SYSDATE,'yyyy')||'-01-01','yyyy-mm-dd' ) FROM dual <br />
<br />
<br />
季度的第一天 <br />
<br />
SELECT to_date(to_char(SYSDATE,'yyyy-')|| lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')|| '-01', 'yyyy-mm-dd') FROM dual <br />
<br />
<br />
floor 为向下取整 <br />
lpad 为向左使用指定的字符扩充字符串，这个扩充字符串至2位，不足的补'0'。 <br />
<br />
当天的半夜 <br />
SELECT trunc(SYSDATE)+1-1/24/60/60 <br />
FROM dual <br />
<br />
trunc 是将 sysdate 的时间部分截掉，即时间部分变成 00:00:00 <br />
<span class="hilite1">Oracle</span>中日期加减是按照天数进行的，所以 +1-1/24/60/60 使时间部分变成了 23:59:59。 <br />
<span class="hilite1">Oracle</span> 8i 中仅支持时间到秒，9i以上则支持到 1/100000000 秒。 <br />
<br />
上个月的最后一天 <br />
<br />
SELECT trunc(last_day(add_months(SYSDATE,-1)))+1-1/24/60/60 FROM dual <br />
<br />
<br />
add_months 是月份加减函数。 <br />
last_day 是求该月份的最后一天的函数。 <br />
<br />
本年的最后一天 <br />
<br />
SELECT trunc(last_day(to_date(to_char(SYSDATE,'yyyy')||'-12-01','yyyy-mm-dd')) )+1-1/24/60/60 FROM dual <br />
<br />
<br />
本月的最后一天 <br />
<br />
select trunc(last_day(sysdate))+1-1/24/60/60 from dual <br />
<br />
<br />
<br />
本月的第一个星期一 <br />
<br />
SELECT next_day( to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd'), '星期一' ) FROM dual <br />
<br />
next_day 为计算从指定日期开始的第一个符合要求的日期，这里的'星期一'将根据NLS_DATE_LANGUAGE的设置稍有不同。 <br />
<br />
去掉时分秒 <br />
<br />
select trunc(sysdate) from dual <br />
<br />
<br />
显示星期几 <br />
<br />
SELECT to_char(SYSDATE,'Day') FROM dual <br />
<br />
<br />
取得某个月的天数 <br />
<br />
SELECT trunc(last_day(SYSDATE))- to_date(to_char(SYSDATE,'yyyy-mm')||'-01','yyyy-mm-dd')+ 1 FROM dual <br />
<br />
<br />
判断是否闰年 <br />
<br />
SELECT decode( to_char(last_day(to_date(to_char(SYSDATE,'yyyy')||'-02-01','yyyy-mm-dd')),'dd'), '28','平年','闰年' ) FROM dual <br />
<br />
<br />
一个季度多少天 <br />
<br />
SELECT last_day(to_date(to_char(SYSDATE,'yyyy-')|| lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+3,2,'0')|| '-01','yyyy-mm-dd')) - to_date(to_char(SYSDATE,'yyyy-')|| lpad(floor(to_number(to_char(SYSDATE,'mm'))/3)*3+1,2,'0')|| '-01','yyyy-mm-dd') +1FROM dual <br />
<br />
<br />
1、add_months()用于从一个日期值增加或减少一些月份 <br />
SQL&gt; select add_months(sysdate,12) "Next Year" from dual; <br />
<br />
2、current_date()返回当前会放时区中的当前日期 <br />
SQL&gt; select sessiontimezone,current_date from dual; <br />
<br />
3、current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期 <br />
<br />
4、dbtimezone()返回时区 <br />
varchar_value:=dbtimezone <br />
SQL&gt; select dbtimezone from dual; <br />
<br />
5、extract()找出日期或间隔值的字段值 <br />
SQL&gt; select extract(month from sysdate) "This Month" from dual; <br />
<br />
SQL&gt; select extract(year from add_months(sysdate,36)) "3 Years Out" from dual; <br />
<br />
SQL&gt; <br />
<br />
6、last_day()返回包含了日期参数的月份的最后一天的日期 <br />
date_value:=last_day(date_value) <br />
SQL&gt; select last_day(date'2000-02-01') "Leap Yr?" from dual; <br />
SQL&gt; select last_day(sysdate) "Last day of this month" from dual; <br />
<br />
SQL&gt; <br />
<br />
7、localtimestamp()返回会话中的日期和时间 <br />
timestamp_value:=localtimestamp <br />
SQL&gt; select localtimestamp from dual; <br />
SQL&gt; select localtimestamp,current_timestamp from dual; <br />
<br />
SQL&gt; select localtimestamp,to_char(sysdate,'DD-MM-YYYY HH:MI:SS AM') "SYSDATE" SQL&gt; <br />
<br />
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; <br />
SQL&gt; select months_between(sysdate,date'2001-01-01') from dual; <br />
<br />
9、next_day()给定一个日期值，返回由第二个参数指出的日子第一次出现在的日期值（应返回相应日子的名称字符串）
<img src ="http://www.blogjava.net/lianyeyu/aggbug/201097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lianyeyu/" target="_blank">连夜雨</a> 2008-05-17 15:23 <a href="http://www.blogjava.net/lianyeyu/archive/2008/05/17/201097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中常见函数的使用</title><link>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201087.html</link><dc:creator>连夜雨</dc:creator><author>连夜雨</author><pubDate>Sat, 17 May 2008 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201087.html</guid><wfw:comment>http://www.blogjava.net/lianyeyu/comments/201087.html</wfw:comment><comments>http://www.blogjava.net/lianyeyu/archive/2008/05/17/201087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lianyeyu/comments/commentRss/201087.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lianyeyu/services/trackbacks/201087.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;工作中根据不同的业务需要查询出不同的结果集，于是用到了以前很少用到的一些Oracle函数，先记录下来收集的一些函数的用法。<br />
<br />
<span style="font-size: 14pt; font-family: 黑体"><strong style="font-family: 宋体">nvl</strong></span></p>
过查询获得某个字段的合计值，如果这个值位null将给出一个预设的默认值<br />
<font color="brown">select nvl(sum(t.dwxhl),1) from tb_jhde t where zydm=-1<br />
</font>这里关心的nvl的用法，nvl（arg,value）代表如果前面的arg的值为null那么返回的值为后面的value 。
<p>另一个有关的有用方法<br />
<font color="brown">declare&nbsp;<br />
i integer<br />
select nvl(sum(t.dwxhl),1) into i from tb_jhde t where zydm=-1<br />
</font>这样就可以把获得的合计值存储到变量i中，如果查询的值为null就把它的值设置为默认的1 。<br />
<br />
GREATEST<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
功能: 集合中的最大值 <br />
思路: 确定第一个参数是什么类型,之后所有的参数全部转换成这种类型再比较. <br />
<br />
注意: <br />
(1) 参数只能是集合,不能是子查询.<br />
(2) 并且只选择第一个字符最大的. <br />
<br />
函数: <br />
FUNCTION GREATEST (pattern NUMBER) return NUMBER;<br />
pragma BUILTIN('GREATEST',12,240,240);-- This is special cased in PH2 -- Pj<br />
<br />
function GREATEST (pattern VARCHAR2 CHARACTER SET ANY_CS)<br />
return VARCHAR2 CHARACTER SET pattern%CHARSET;&nbsp;&nbsp;&nbsp; <br />
pragma BUILTIN('GREATEST',12,240,240);-- This is special cased in PH2 -- Pj<br />
<br />
function GREATEST (pattern DATE) return DATE;<br />
pragma BUILTIN('GREATEST',12,240,240);-- This is special cased in PH2 -- Pj<br />
<br />
例子:<br />
SELECT GREATEST(SELECT gb.set_of_books_id FROM gl_sets_of_books gb)<br />
FROM dual<br />
--ORA-00936: missing expression<br />
<br />
SELECT GREATEST(100,1,3,11)FROM dual;<br />
--100<br />
<br />
SELECT GREATEST('100',1,3,11)FROM dual;<br />
--3<br />
<br />
SELECT GREATEST('a',1,3,11)FROM dual;<br />
--'a'<br />
<br />
SELECT GREATEST('abc','bcd','cde','cda')FROM dual;<br />
--'cde'<br />
--这里只是 <br />
<br />
SELECT GREATEST(100,1,'3',11)FROM dual;<br />
--100<br />
<br />
SELECT GREATEST(100,1,3,'a')FROM dual;<br />
--ORA-01722: invalid number<br />
--无效数字 <br />
<br />
<strong style="font-size: 14pt">start with&#8230;&#8230;connect by<br />
</strong></p>
使用start with&#8230;&#8230;connect by子句进行分级查询<br />
<br />
部门branch_code与营业部sub_branch_cod关系二叉树如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 02<br />
&nbsp;&nbsp;&nbsp;&nbsp; 011&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 012&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 022<br />
0111&nbsp;0112&nbsp;0121&nbsp;0122&nbsp;0211&nbsp;0212&nbsp;0221&nbsp;0222<br />
<br />
* start with 用于指定查询的根行<br />
* connect by 用于指定父行与子行的关系<br />
* PRIOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在条件表达式中引导父行<br />
* lpad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数用来填充字段串左边的位置，从而达到格式化的目的<br />
* where&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于过滤查询结果 <br />
<br />
--查询语句：<br />
SQL&gt; select lpad(branch_code,LENGTH(branch_code)+(LEVEL*2)-2,'_') as branch<br />
&nbsp; 2&nbsp; from test_11<br />
&nbsp; 3&nbsp; where branch_code &lt;&gt; '0000'<br />
&nbsp; 4&nbsp; start with branch_code='0'<br />
&nbsp; 5&nbsp; connect by PRIOR sub_branch_code=branch_code<br />
&nbsp; 6&nbsp; /<br />
<br />
BRANCH<br />
--------------------------------------------------------------------------------<br />
0<br />
__01<br />
____012<br />
____012<br />
__01<br />
____011<br />
____011<br />
0<br />
__02<br />
____021<br />
____021<br />
__02<br />
____022<br />
____022 <br />
14 rows selected<br />
<br />
<strong style="font-size: 14pt">intersect运算</strong> <br />
返回查询结果中相同的部分 <br />
<br />
(各个部门中有哪些相同的工种) <br />
select job from account intersect select job from research <br />
intersect <br />
select job from sales; <br />
<br />
<strong style="font-size: 14pt">minus运算</strong> <br />
返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。<br />
 <br />
(有哪些工种在财会部中有，而在销售部中没有？) <br />
select job from account <br />
minus <br />
select job from sales;<br />
<br />
<strong>取四舍五入的几位小数</strong><br />
<span style="font-size: 12px"><span style="font-size: 12pt">round(n+0.{m个0}5, m)<br />
</span><br />
<span style="font-size: 12pt">比如， 取两位的话:<br />
round(15.333 + 0.005, 2)</span><br />
</span>
 <img src ="http://www.blogjava.net/lianyeyu/aggbug/201087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lianyeyu/" target="_blank">连夜雨</a> 2008-05-17 14:07 <a href="http://www.blogjava.net/lianyeyu/archive/2008/05/17/201087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>