oracle之时间查询

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值