您的位置:首页 > 数据库 > Oracle

Oracle中不同条件的日期查询

2016-11-24 17:03 225 查看
(转发参考的)

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; 
   


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: