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;