数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle中对时间操作的一些总结


发布日期:2023年07月14日
 
Oracle中对时间操作的一些总结

Oracle中对时间操作的一些总结

sysdate+(///) 在系统时间基础上延迟

sysdate+// 在系统时间基础上延迟分钟

sysdate+/ 在系统时间基础上延迟小时

sysdate+ 在系统时间基础上延迟

add_months(sysdate) 在系统时间基础上延迟

add_months(sysdate*) 在系统时间基础上延迟

上月末的日期select last_day(add_months(sysdate )) from dual;

本月的最后一秒select trunc(add_months(sysdate)MM) /// from dual

本周星期一的日期select trunc(sysdateday)+ from dual

年初至今的天数select ceil(sysdate trunc(sysdate year)) from dual;

今天是今年的第几周 :select to_char(sysdatefmww) from dual

今天是本月的第几周:SELECT TO_CHAR(SYSDATEWW) TO_CHAR(TRUNC(SYSDATEMM)WW) + AS weekOfMon FROM dual

本月的天数

SELECT to_char(last_day(SYSDATE)dd) days FROM dual

今年的天数

select add_months(trunc(sysdateyear) ) trunc(sysdateyear) from dual

下个星期一的日期

SELECT Next_day(SYSDATEmonday) FROM dual

============================================

计算工作日方法

create table t(s datee date);

alter session set nls_date_format = yyyymmdd;

insert into t values();

insert into t values();

insert into t values();

insert into t values();

insert into t values();

insert into t values();

这里假定日期都是不带时间的否则在所有日期前加trunc即可

select sees+ total_days

trunc((es+)/)* + length(replace(substr(to_char(sd)mod(es+)))) work_days

from t;

drop table t;

引此?s=cdfbbcadbecdef&threadid=&perpage=&pagenumber=

================================================================================

判断当前时间是上午下午还是晚上

SELECT CASE

WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 上午

WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 下午

WHEN to_number(to_char(SYSDATEhh)) BETWEEN AND THEN 晚上

END

FROM dual;

================================================================================

Oracle 中的一些处理日期

将数字转换为任意时间格式如秒:需要转换为天/小时

SELECT to_char(floor(TRUNC(/(*))/))||||to_char(mod(TRUNC(/(*))))||小时 FROM DUAL

TO_DATE格式

Day:

dd number

dy abbreviated fri

day spelled out friday

ddspth spelled out ordinal twelfth

Month:

mm number

mon abbreviated mar

month spelled out march

Year:

yy two digits

yyyy four digits

小时格式下时间范围为 :: ::

小时格式下时间范围为 :: ::

日期和字符转换函数用法(to_dateto_char)

select to_char( to_date(J)Jsp) from dual

显示Two Hundred TwentyTwo

求某天是星期几

select to_char(to_date(yyyymmdd)day) from dual;

星期一

select to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE = American) from dual;

monday

设置日期语言

ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN;

也可以这样

TO_DATE ( YYYYmmdd NLS_DATE_LANGUAGE = American)

两个日期间的天数

select floor(sysdate to_date(yyyymmdd)) from dual;

时间为null的用法

select id active_date from table

UNION

select TO_DATE(null) from dual;

注意要用TO_DATE(null)

a_date between to_date(yyyymmdd) and to_date(yyyymmdd)

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

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

日期格式沖突问题

输入的格式要看你安装的ORACLE字符集的类型 比如: USASCII date格式的类型就是: Jan

alter system set NLS_DATE_LANGUAGE = American

alter session set NLS_DATE_LANGUAGE = American

或者在to_date中写

select to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE = American) from dual;

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

可查看

select * from nls_session_parameters

select * from V$NLS_PARAMETERS

select count(*)

from ( select rownum rnum

from all_objects

where rownum <= to_date(yyyymmdd) to_date(

yyyymmdd)+

)

where to_char( to_date(yyyymmdd)+rnum D )

not

in ( )

查找间除星期一和七的天数

在前后分别调用DBMS_UTILITYGET_TIME 让后将结果相减(得到的是/ 而不是毫秒)

select months_between(to_date(MMDDYYYY)

to_date(MMDDYYYY)) MONTHS FROM DUAL;

select months_between(to_date(MMDDYYYY)

to_date(MMDDYYYY)) MONTHS FROM DUAL;

Next_day的用法

Next_day(date day)

MondaySunday for format code DAY

MonSun for format code DY

for format code D

select to_char(sysdatehh:mi:ss) TIME from all_objects

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

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

create or replace function sys_date return date is

begin

return sysdate;

end;

select to_char(sys_datehh:mi:ss) from all_objects;

获得小时数

SELECT EXTRACT(HOUR FROM TIMESTAMP ::) from offer

SQL> select sysdate to_char(sysdatehh) from dual;

SYSDATE TO_CHAR(SYSDATEHH)

::

SQL> select sysdate to_char(sysdatehh) from dual;

SYSDATE TO_CHAR(SYSDATEHH)

::

获取年月日与此类似

年月日的处理

select older_date

newer_date

years

months

abs(

trunc(

newer_date

add_months( older_dateyears*+months )

)

) days

from ( select

trunc(months_between( newer_date older_date )/) YEARS

mod(trunc(months_between( newer_date older_date ))

) MONTHS

newer_date

older_date

from ( select hiredate older_date

add_months(hiredaterownum)+rownum newer_date

from emp )

)

处理月份天数不定的办法

select to_char(add_months(last_day(sysdate) + ) yyyymmdd)last_day(sysdate) from dual

找出今年的天数

select add_months(trunc(sysdateyear) ) trunc(sysdateyear) from dual

闰年的处理方法

to_char( last_day( to_date( ¦ ¦ :yearmmyyyy) ) dd )

如果是就不是闰年

yyyy与rrrr的区别

YYYY TO_C

yyyy

rrrr

yyyy

rrrr

不同时区的处理

select to_char( NEW_TIME( sysdate GMTEST) dd/mm/yyyy hh:mi:ss) sysdate

from dual;

秒钟一个间隔

Select TO_DATE(FLOOR(TO_CHAR(sysdateSSSSS)/) * SSSSS) TO_CHAR(sysdateSSSSS)

from dual

::

SSSSS表示位秒数

一年的第几天

select TO_CHAR(SYSDATEDDD)sysdate from dual

::

计算小时毫秒

select

Days

A

TRUNC(A*) Hours

TRUNC(A** *TRUNC(A*)) Minutes

TRUNC(A*** *TRUNC(A**)) Seconds

TRUNC(A**** *TRUNC(A***)) mSeconds

from

(

select

trunc(sysdate) Days

sysdate trunc(sysdate) A

from dual

)

select * from tabname

order by decode(modeFIFO)*to_char(rqyyyymmddhhmiss);

//

floor((datedate) /) 作为年

floor((datedate ) /) 作为月

mod(mod(datedate ) )作为日

next_day函数

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

日 一 二 三 四 五 六

select (sysdateto_date( ::yyyymmdd hh:mi:ss))*** from dual

日期 返回的是天 然后 转换为ss

转此;ID=

将数字转换为任意时间格式如秒:需要转换为天/小时

SELECT to_char(floor(TRUNC(/(*))/))||||to_char(mod(TRUNC(/(*))))||小时 FROM DUAL

TO_DATE格式

Day:

dd number

dy abbreviated fri

day spelled out friday

ddspth spelled out ordinal twelfth

Month:

mm number

mon abbreviated mar

month spelled out march

Year:

yy two digits

yyyy four digits

小时格式下时间范围为 :: ::

小时格式下时间范围为 :: ::

日期和字符转换函数用法(to_dateto_char)

select to_char( to_date(J)Jsp) from dual

显示Two Hundred TwentyTwo

求某天是星期几

select to_char(to_date(yyyymmdd)day) from dual;

星期一

select to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE = American) from dual;

monday

设置日期语言

ALTER SESSION SET NLS_DATE_LANGUAGE=AMERICAN;

也可以这样

TO_DATE ( YYYYmmdd NLS_DATE_LANGUAGE = American)

两个日期间的天数

select floor(sysdate to_date(yyyymmdd)) from dual;

时间为null的用法

select id active_date from table

UNION

select TO_DATE(null) from dual;

注意要用TO_DATE(null)

a_date between to_date(yyyymmdd) and to_date(yyyymmdd)

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

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

日期格式沖突问题

输入的格式要看你安装的ORACLE字符集的类型 比如: USASCII date格式的类型就是: Jan

alter system set NLS_DATE_LANGUAGE = American

alter session set NLS_DATE_LANGUAGE = American

或者在to_date中写

select to_char(to_date(yyyymmdd)dayNLS_DATE_LANGUAGE = American) from dual;

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

可查看

select * from nls_session_parameters

select * from V$NLS_PARAMETERS

select count(*)

from ( select rownum rnum

from all_objects

where rownum <= to_date(yyyymmdd) to_date(

yyyymmdd)+

)

where to_char( to_date(yyyymmdd)+rnum D )

not

in ( )

查找间除星期一和七的天数

在前后分别调用DBMS_UTILITYGET_TIME 让后将结果相减(得到的是/ 而不是毫秒)

select months_between(to_date(MMDDYYYY)

to_date(MMDDYYYY)) MONTHS FROM DUAL;

select months_between(to_date(MMDDYYYY)

to_date(MMDDYYYY)) MONTHS FROM DUAL;

Next_day的用法

Next_day(date day)

MondaySunday for format code DAY

MonSun for format code DY

for format code D

select to_char(sysdatehh:mi:ss) TIME from all_objects

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

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

create or replace function sys_date return date is

begin

return sysdate;

end;

上一篇:ORACLE之常用FAQ V1.0

下一篇:介绍几种场景下使用ODU进行数据恢复