Oracle数据库中日期的计算方法

 

Oracle数据库中日期的计算方法

分类: oracle数据库 oracle数据库2005-02-17 18:03 1427人阅读 评论(0) 收藏 举报

1、TO_DATE()函数中相关的参数说明:
   Day: 
       dd 两位数字格式,最大为31 
       dy 礼拜几的英文缩写格式,例如礼拜5缩写为fri 
       day 礼拜几的英文格式,例如礼拜5就是friday 
       ddspth spelled out, ordinal twelfth 
    Month: 
       mm 两位数字格式,最大为12 
       mon 英文月份的缩写格式,例如3月march缩写为mar 
       month 英文月份的全拼形式,例如3月就是march 
    Year: 
       yy  两位数字格式,例如98表示1998年 
       yyyy 四位数字格式,例如1998表示1998年
    Hour:
       hh12 表示12小时计时
       hh24 表示24小时计时
    Minute:
       mi  表示分钟
    Second:
       ss  表示秒数
2、TO_DATE()和TO_CHAR()函数使用
select to_char( to_date(222,'J'),'Jsp') from dual
显示Two Hundred Twenty-Two 

3、求某天是星期几 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 
星期一 
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;monday 
设置日期语言

 

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

 

 

也可以这样

 

 

TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 
4、两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
5、时间为null的用法

select id, active_date from table1

 

 

UNION

 

 

select 1, TO_DATE(null) from dual;

 

 

 

 

 

注意要用TO_DATE(null)

 

 

6、a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')

 

 

那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。

 

 

所以,当时间需要精确的时候,觉得to_char还是必要的

 

 

7、日期格式冲突问题

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select id, active_date from table1

 

 

UNION

 

 

select 1, TO_DATE(null) from dual;

 

 

 

 

 

注意要用TO_DATE(null)

 

 

6、a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')

 

 

那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。

 

 

所以,当时间需要精确的时候,觉得to_char还是必要的

 

 

7、日期格式冲突问题

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

 

 

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

 

 

也可以这样

 

 

TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 
4、两个日期间的天数
select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
5、时间为null的用法

select id, active_date from table1

 

 

UNION

 

 

select 1, TO_DATE(null) from dual;

 

 

 

 

 

注意要用TO_DATE(null)

 

 

6、a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')

 

 

那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。

 

 

所以,当时间需要精确的时候,觉得to_char还是必要的

 

 

7、日期格式冲突问题

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select id, active_date from table1

 

 

UNION

 

 

select 1, TO_DATE(null) from dual;

 

 

 

 

 

注意要用TO_DATE(null)

 

 

6、a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')

 

 

那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。

 

 

所以,当时间需要精确的时候,觉得to_char还是必要的

 

 

7、日期格式冲突问题

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

 

 

alter system set NLS_DATE_LANGUAGE = American

 

 

alter session set NLS_DATE_LANGUAGE = American

 

 

或者在to_date中写

 

 

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

 

 

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

 

 

可查看

 

 

select * from nls_session_parameters

 

 

select * from V$NLS_PARAMETERS

 

 

8、

select count(*)

 

 

from ( select rownum-1 rnum

 

 

from all_objects

 

 

where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-

 

 

02-01','yyyy-mm-dd')+1

 

 

)

 

 

where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )

 

 

not

 

 

in ( '1', '7' )

 

 

 

 

 

查找2002-02-28至2002-02-01间除星期一和七的天数

 

 

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒)
9、

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

 

select months_between(to_date('01-31-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

1

 

 

 

 

 

select months_between(to_date('02-01-1999','MM-DD-YYYY'),

 

 

to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

 

 

 

 

 

1.03225806451613

 

 

10. Next_day的用法

 

 

Next_day(date, day)

 

 

 

 

 

Monday-Sunday, for format code DAY

 

 

Mon-Sun, for format code DY

 

 

1-7, for format code D

 

 

 

 

 

11

 

 

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

 

 

注意:第一条记录的TIME 与最后一行是一样的

 

 

可以建立一个函数来处理这个问题

 

 

create or replace function sys_date return date is

 

 

begin

 

 

return sysdate;

 

 

end;

 

 

 

 

 

select to_char(sys_date,'hh:mi:ss') from all_objects;

 

 

12.

 

 

获得小时数

 

 

 

 

 

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

 

 

SQL> select sysdate ,to_char(sysdate,'hh') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH')

 

 

-------------------- ---------------------

 

 

2003-10-13 19:35:21 07

 

 

 

 

 

SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

 

 

 

 

 

SYSDATE TO_CHAR(SYSDATE,'HH24')

 

 

-------------------- -----------------------

 

 

2003-10-13 19:35:21 19

 

 

 

 

 

获取年月日与此类似

 

 

13.

 

 

年月日的处理

 

 

select older_date,

 

 

newer_date,

 

 

years,

 

 

months,

 

 

abs(

 

 

trunc(

 

 

newer_date-

 

 

add_months( older_date,years*12+months )

 

 

)

 

 

) days

 

 

from ( select

 

 

trunc(months_between( newer_date, older_date )/12) YEARS,

 

 

mod(trunc(months_between( newer_date, older_date )),

 

 

12 ) MONTHS,

 

 

newer_date,

 

 

older_date

 

 

from ( select hiredate older_date,

 

 

add_months(hiredate,rownum)+rownum newer_date

 

 

from emp )

 

 

)

 

 

 

 

 

14.

 

 

处理月份天数不定的办法

 

 

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

 

 

 

 

 

16.

 

 

找出今年的天数

 

 

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

 

 

 

 

 

闰年的处理方法

 

 

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

 

 

如果是28就不是闰年

 

 

 

 

 

17.

 

 

yyyy与rrrr的区别

 

 

'YYYY99 TO_C

 

 

------- ----

 

 

yyyy 99 0099

 

 

rrrr 99 1999

 

 

yyyy 01 0001

 

 

rrrr 01 2001

 

 

 

 

 

18.不同时区的处理

 

 

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

 

 

from dual;

 

 

 

 

 

19.

 

 

5秒钟一个间隔

 

 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')

 

 

from dual

 

 

 

 

 

2002-11-1 9:55:00 35786

 

 

SSSSS表示5位秒数

 

 

 

 

 

20.

 

 

一年的第几天

 

 

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

 

 

310 2002-11-6 10:03:51

 

 

 

 

 

21.计算小时,分,秒,毫秒

 

 

select

 

 

Days,

 

 

A,

 

 

TRUNC(A*24) Hours,

 

 

TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,

 

 

TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,

 

 

TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds

 

 

from

 

 

(

 

 

select

 

 

trunc(sysdate) Days,

 

 

sysdate - trunc(sysdate) A

 

 

from dual

 

 

)

 

 

 

 

 

select * from tabname

 

 

order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

 

 

 

 

 

//

 

 

floor((date2-date1) /365) 作为年

 

 

floor((date2-date1, 365) /30) 作为月

 

 

mod(mod(date2-date1, 365), 30)作为日.

 

 

23.next_day函数

 

 

next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。

 

 

1  2  3  4  5  6  7

 

 

日 一 二 三 四 五 六

 

 

 

posted @ 2012-01-17 16:27  ω♪zone咕咯  阅读(551)  评论(0)    收藏  举报