频道栏目
首页 > 资讯 > Oracle > 正文

Oracle数据库SQL总结

11-06-19        来源:[db:作者]  
收藏   我要投稿

1Oracle时间段的查询

1.1 场景:根据用户输入的时间段过滤出相应记录。

1.2 解决办法:

第一种写法:


Sql代码 
SELECT * FROM T_XJXX_XJGL  
WHERE CREATEDATE >= TO_DATE(2011-6-13, yyyy-MM-dd)  
AND CREATEDATE <= TO_DATE(2011-6-17, yyyy-MM-dd); 

SELECT * FROM T_XJXX_XJGL
WHERE CREATEDATE >= TO_DATE(2011-6-13, yyyy-MM-dd)
AND CREATEDATE <= TO_DATE(2011-6-17, yyyy-MM-dd); 
第二种写法:


Sql代码 
SELECT * FROM T_XJXX_XJGL  
WHERE TO_CHAR(CREATEDATE, yyyy-MM-dd) >= 2011-6-13 
AND TO_CHAR(CREATEDATE, yyyy-MM-dd) <= 2011-6-16; 

SELECT * FROM T_XJXX_XJGL
WHERE TO_CHAR(CREATEDATE, yyyy-MM-dd) >= 2011-6-13
AND TO_CHAR(CREATEDATE, yyyy-MM-dd) <= 2011-6-16;

 第三种写法:


Sql代码 
SELECT * FROM T_XJXX_XJGL  
WHERE CREATEDATE > TO_DATE(2011-6-15, yyyy-MM-dd) - 1  
AND CREATEDATE <= TO_DATE(2011-6-16, yyyy-MM-dd) + 1; 

SELECT * FROM T_XJXX_XJGL
WHERE CREATEDATE > TO_DATE(2011-6-15, yyyy-MM-dd) - 1
AND CREATEDATE <= TO_DATE(2011-6-16, yyyy-MM-dd) + 1;

取出当前时间在开始时间和结束时间范围内的记录:


Sql代码 
SELECT * FROM T_XJXX_XJGL  
WHERE 1 = 1  
AND TO_CHAR(KSSJ, yyyy-mm-dd) <= TO_CHAR(SYSDATE, yyyy-mm-dd)  
AND TO_CHAR(JSSJ, yyyy-mm-dd) >= TO_CHAR(SYSDATE, yyyy-mm-dd) 

SELECT * FROM T_XJXX_XJGL
WHERE 1 = 1
AND TO_CHAR(KSSJ, yyyy-mm-dd) <= TO_CHAR(SYSDATE, yyyy-mm-dd)
AND TO_CHAR(JSSJ, yyyy-mm-dd) >= TO_CHAR(SYSDATE, yyyy-mm-dd)

2 Oracle创建触发器的例子

2.1场景:创建T_XJXX_XJGL中BH字段为自增长类型,start by 1 increment by 1

2.2解决方法:BH字段的类型设置为number,创建Sequence


Sql代码 
CREATE SEQUENCE  SEQ_XJXX_BH    
MINVALUE 1 MAXVALUE 999999   
INCREMENT BY 1 START WITH 11   
CACHE 10 NOORDER  NOCYCLE ; 

CREATE SEQUENCE  SEQ_XJXX_BH 
MINVALUE 1 MAXVALUE 999999
INCREMENT BY 1 START WITH 11
CACHE 10 NOORDER  NOCYCLE ; 创建触发器:


Sql代码 
CREATE OR REPLACE TRIGGER TR_ADDID  
BEFORE   INSERT   ON   T_XJXX_XJGL  
FOR   EACH   ROW  
BEGIN 
      IF (:NEW.BH IS NULL) THEN 
        SELECT SEQ_XJXX_BH.NEXTVAL INTO :NEW.BH FROM DUAL;  
      END IF;  
END; 

CREATE OR REPLACE TRIGGER TR_ADDID
BEFORE   INSERT   ON   T_XJXX_XJGL
FOR   EACH   ROW
BEGIN
      IF (:NEW.BH IS NULL) THEN
        SELECT SEQ_XJXX_BH.NEXTVAL INTO :NEW.BH FROM DUAL;
      END IF;
END;

3 Oracle中经常使用的函数

3.1场景:按照用户设定的定时器时间段,过滤出数据后Update下一执行时间。例如用户设定是邮件发送频率为每月15号 12:00:00发送,则计算出下一发送时间点为当前发送时间+1个月;设定频率为每周一 09:00:00发送,则计算出下一发送时间+一周

3.2解决方法:

1)、ADD_MONTHS(x,y)函数,平时我使用的场景也就是对月份进行加减时使用ADD_MONTHS函数,其中y若是负整数表示对月份的减操作;y是正整数表示对x月份添加y个月


Sql代码 
SELECT ADD_MONTHS(SYSDATE, -1) FROM DUAL 

SELECT ADD_MONTHS(SYSDATE, -1) FROM DUAL2)、NEXT_DAY(x,day)返回x日期下一个day的日期,新手需要注意的是这里的day指的是星期。1表示星期天、2表示星期一,以此类推。


Sql代码 
SELECT NEXT_DAY(SYSDATE, 2) FROM DUAL; 

SELECT NEXT_DAY(SYSDATE, 2) FROM DUAL; 返回从当前时间开始计算下一星期一的日期。

3)、如果是+1天或是-1天的操作可以直接对日期进行+-操作,like this


Sql代码 
SELECT SYSDATE-1 FROM dual  

SELECT SYSDATE-1 FROM dual oracle支持对日期进行运算,运算时是以天为单位进行的。

4)、LAST_DAY(x) 获取x月份中的最后一天

5)、MONTHS_BETWEEN(x,y);x>y返回正数,表示x和y之间相隔的月份数(实际项目中没使用过,暂时不做太多记录)。

字符串处理函数:

6)、nvl(x,value),如果x is null 则返回value中的值,否则返回x;

7)、length(x),返回x的字符长度;

8)、substr(x,start,length) 截取字符串,对字符串x进行截取,从start开始截取的长度为length;如果需要取字符串的后面几位可以这样写:


Sql代码 
SELECT SUBSTR(TEST, -2) FROM DUAL; 

 SELECT SUBSTR(TEST, -2) FROM DUAL; 返回最后两位字符 ST

 

 

4、Oracle中伪列的使用技巧

4.1场景:利用oracle中的伪列进行分页是一种简单方便的分页手段有些场景中我们也可以使用伪列来代替组函数,从而巧妙的实现过滤要求。

1 )  利用伪列取出工资最高的第6到第10名雇员的记录

 


Sql代码 
SELECT *  
  FROM (SELECT ROWNUM RN, TEMP.*  
          FROM (SELECT E.ENAME, E.SAL  
                  FROM EMP E  
                 WHERE ROWNUM <= 10  
                 ORDER BY E.SAL DESC) TEMP)  
 WHERE RN > 5 

 SELECT *
   FROM (SELECT ROWNUM RN, TEMP.*
           FROM (SELECT E.ENAME, E.SAL
                   FROM EMP E
                  WHERE ROWNUM <= 10
                  ORDER BY E.SAL DESC) TEMP)
  WHERE RN > 5
 
2 ) 利用伪列进行分页操作:

 


Sql代码 
SELECT B.*, RN  
  FROM (SELECT A.*, ROWNUM AS RN2  
          FROM (SELECT XXKC.WID,  
                       ...  
                       ROWNUM AS RN  
                  FROM T_PY_XXKC XXKC  
                  LEFT JOIN T_PY_KC KC ON KC.KCDM = XXKC.XXKCDM  
                 ORDER BY XXKC.XXKCDM) A) B  
 WHERE B.RN2 >  v_start   
 AND B.RN2 <=  (((v_start/10) + 1) * v_limit ) 

SELECT B.*, RN
  FROM (SELECT A.*, ROWNUM AS RN2
          FROM (SELECT XXKC.WID,
                       ...
                       ROWNUM AS RN
           

相关TAG标签
上一篇:oracle分页小谈
下一篇:springmvc+freemarker与servlet性能对比
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站