分享

Oracle中不同条件的日期查询

 紫火神兵 2012-09-13

Oracle SQL查询,日期过滤条件要注意的一点

应当用:

    where TO_CHAR(t.RecordTime, 'yyyymmdd') = '20100519'

不能用:

    where t.RecordTime = TO_DATE('200100519', 'yyyymmdd')

to_char是把日期截取出来跟待查询的日期去比较

to_date是把待查询的日期转成日期格式去与数据库中相关列的内容作比较

to_date转的时候,如果要过滤的日期是20100519,转成yyyymmdd的格式标准日期格式之后,后面会拼上时分秒,默认为00:00:00

--如果表个数是不确定的  写个存储过程吧  调用时输入表名作为参数即可自动

--将记录取出插入pdbase表中

create or replace procedure p_name

(M_tablename in varchar)   --需要提取数据的表名

as

--定义过程中的变量,变量类型根据自己需要定义,varchar2类型的需带精度

L_column1     varchar2(20); 

L_column2     varchar2(20); 

L_column3     varchar2(20); 

--定义一个游标

CURSOR C_CHARGES IS

select column1,column2,column3     --记录的列多的话,可以多定义几个

 from M_tablename

 where datetime >=

       to_date('2004-05-27 07:00:00', 'yyyy-mm-dd hh24:mi:ss')

       and

       datetime <=

       to_date('2004-06-27 07:00:00', 'yyyy-mm-dd hh24:mi:ss')


begin

OPEN C_CHARGES;

  LOOP

    FETCH C_CHARGES

      INTO L_column1,L_column2,L_column3

    EXIT WHEN C_CHARGES%NOTFOUND;

 insert into pdbase

      (column1,column2,column3)

    values

     (L_column1,L_column2,L_column3)

end loop;

CLOSE C_CHARGES;

end; 


--如果表个数是确定的,且只要查询效果,可直接使用合并查询

select * from t_test_1

where dt>=to_date('2010-04-03 07:00:00', 'yyyy-mm-dd hh24:mi:ss') and

       dt<=to_date('2010-04-10 07:00:00', 'yyyy-mm-dd hh24:mi:ss') 

union

select * from t_test_2 

 where dt>=to_date('2010-04-03 07:00:00', 'yyyy-mm-dd hh24:mi:ss') and

       dt<=to_date('2010-04-10 07:00:00', 'yyyy-mm-dd hh24:mi:ss')

union

select * from t_test_3 

 where dt>=to_date('2010-04-03 07:00:00', 'yyyy-mm-dd hh24:mi:ss') and

       dt<=to_date('2010-04-10 07:00:00', 'yyyy-mm-dd hh24:mi:ss')


--有几个表,写几个union连接在后面即可


select * from tablename where eventtimestamp >=

       to_date('2004-05-27 07:00:00', 'yyyy-mm-dd hh24:mi:ss')

       and eventtimestamp <=

       to_date('2004-06-27 07:00:00', 'yyyy-mm-dd hh24:mi:ss')

log_table表

table_date是字段

from_str to_str 2个时间段字符串



select * from log_table where table_date >= TO_DATE('from_str','YYYY-MM-DD HH-MM-SS') and table_date <= TO_DATE('to_str','YYYY-MM-DD HH-MM-SS') 


INSERT INTO pdbase (A,B,C....)SELECT A,B,C FROM (SELECT A,B,C...FROM 表1 union SELECT A,B,C...FROM 表2 union SELECT A,B,C...FROM 表3 union ....) WHERE pdbase.P_DATE BETWEEN TO_DATE('2004-05-27 07:00:00','yyyy-mm-dd hh24:mi:ss'  ) AND TO_DATE('2004-06-27 07:00:00', 'yyyy-mm-dd hh24:mi:ss') 

insert pdbase into (

 select * from biao1  where 日期 > ?

                          and 日期< ?

union all 

select * from biao2  where 日期 > ?

                          and 日期< ?

......




select   *   from   mytable   where   to_char(install_date,'YYYYMMDD')   >   '20050101'  

select   *   from   mytable   where   install_date     >   to_date('20050101','yyyymmdd');

取得当前日期是本月的第几周

SQL>   select   to_char(sysdate,'YYYYMMDD   W   HH24:MI:SS')   from   dual;
  
TO_CHAR(SYSDATE,'YY
-------------------
20080327   4   18:16:09
  
SQL>   select   to_char(sysdate,'W')   from   dual;
  
T
-
4

№2:取得当前日期是一个星期中的第几天,注意星期日是第一天

SQL>   select   sysdate,to_char(sysdate,'D')   from   dual;
  
SYSDATE       T
---------   -
27-MAR-08   5

类似:

select   to_char(sysdate,'yyyy')   from   dual;   --当前年
select   to_char(sysdate,'Q'   from   dual;           --当前季度
select   to_char(sysdate,'mm')   from   dual;       --当前月
select   to_char(sysdate,'dd')   from   dual;       --当前日
ddd   年中的第几天
WW   年中的第几个星期
W   该月中第几个星期

DAY 周中的星期几
D   今天对映的NUMBER

'1','星期日',  '2','星期一', '3','星期二', '4','星期三', '5','星期四',  '6','星期五',  '7','星期六'
hh   小时(12)
hh24   小时(24)
Mi   分
ss   秒

№3:取当前日期是星期几的中文显示:

SQL>   select   to_char(sysdate,'day')   from   dual;
  
TO_CHAR(SYSDATE,'DAY')
----------------------
星期四

№4:如果一个表在一个date类型的字段上面建立了索引,如何使用

alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'


№5: 得到当前的日期
select sysdate from dual;

№6: 得到当天凌晨0点0分0秒的日期
select trunc(sysdate) from dual;

-- 得到这天的最后一秒
select trunc(sysdate) + 0.99999 from dual;

-- 得到小时的具体数值
select trunc(sysdate) + 1/24 from dual;

select trunc(sysdate) + 7/24 from dual;

№7:得到明天凌晨0点0分0秒的日期

select trunc(sysdate+1) from dual;

select trunc(sysdate)+1 from dual;


№8: 本月一日的日期
select trunc(sysdate,'mm') from dual;


№9:得到下月一日的日期
select trunc(add_months(sysdate,1),'mm') from dual;

 

№10:返回当前月的最后一天?
select last_day(sysdate) from dual;      
select last_day(trunc(sysdate)) from dual;
select trunc(last_day(sysdate)) from dual;
select trunc(add_months(sysdate,1),'mm') - 1 from dual;


№11: 得到一年的每一天
select trunc(sysdate,'yyyy')+ rn -1 date0
from
(select rownum rn from all_objects
where rownum<366);


№12:今天是今年的第N天
SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;

№13:如何在给现有的日期加上2年
select add_months(sysdate,24) from dual;

№14:判断某一日子所在年分是否为润年
select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;

№15:判断两年后是否为润年
select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;


№16:得到日期的季度

select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;

select to_char(sysdate, 'Q') from dual;

No17:返回某个月的最后一天

select to_char(last_day(sysdate),'dd') from dual

转载:http://hi.baidu.com/fengboy_7334/blog/item/b0aa60035f36a1e809fa935d.html

作者:ZHF     
          出处:http://zhf.cnblogs.com/     
          本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多