转换函数
与date操作关系最大的就是两个转换函数to_date()to_char()
to_date() 作用将字符类型按一定格式转化为日期类型
具体用法:to_date(yyyymmdd)前者为字符串后者为转换日期格式注意前后两者要以一对应
如;to_date( :: yyyymmdd hh:mi:ss) 将得到具体的时间
多种日期格式
YYYY四位表示的年份
YYYYYY年份的最后三位两位或一位缺省为当前世纪
MM~的月份编号
MONTH九个字符表示的月份右边用空格填补
MON三位字符的月份缩写
WW一年中的星期
D星期中的第几天
DD月份中的第几天
DDD年所中的第几天
DAY九个字符表示的天的全称右边用空格补齐
HHHH一天中的第几个小时进制表示法
HH一天中的第几个小时取值为~
MI一小时中的分钟
SS一分钟中的秒
SSSS从午夜开始过去的秒数
to_char():将日期转按一定格式换成字符类型
SQL> select to_char(sysdateyyyymmdd hh:mi:ss) time from dual;
TIME
::
即把当前时间按yyyymmdd hh:mi:ss格式转换成字符类型
在oracle中处理日期大全
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
小时格式下时间范围为 :: ::
小时格式下时间范围为 :: ::
[ZT]日期和??函???
日期和字符转换函数用法(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)是从当前开始下一个星期五后面的数字是从星期日开始算起
日 一 二 三 四 五 六
oracle中有很多关于日期的函数
在oracle中有很多关于日期的函数如
add_months()用于从一个日期值增加或减少一些月份
date_value:=add_months(date_valuenumber_of_months)
例
SQL> select add_months(sysdate) Next Year from dual;
Next Year
月
SQL> select add_months(sysdate) Last Year from dual;
Last Year
月
SQL>
current_date()返回当前会放时区中的当前日期
date_value:=current_date
SQL> column sessiontimezone for a
SQL> select sessiontimezonecurrent_date from dual;
SESSIONTIMEZONE CURRENT_DA
+: 月
SQL> alter session set time_zone=:
/
会话已更改
SQL> select sessiontimezonecurrent_timestamp from dual;
SESSIONTIMEZONE CURRENT_TIMESTAMP
: 月 下午 :
SQL>
current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期
timestamp_with_time_zone_value:=current_timestamp([timestamp_precision])
SQL> column sessiontimezone for a
SQL> column current_timestamp format a
SQL> select sessiontimezonecurrent_timestamp from dual;
SESSIONTIMEZONE CURRENT_TIMESTAMP
+: 月 上午 +:
SQL> alter session set time_zone=:
/
会话已更改
SQL> select sessiontimezonecurrent_timestamp from dual;
SESSIONTIMEZONE CURRENT_TIMESTAMP
: 月 下午 :
SQL>
dbtimezone()返回时区
varchar_value:=dbtimezone
SQL> select dbtimezone from dual;
DBTIME
:
SQL>
extract()找出日期或间隔值的字段值
date_value:=extract(date_field from [datetime_value|interval_value])
SQL> select extract(month from sysdate) This Month from dual;
This Month
SQL> select extract(year from add_months(sysdate)) Years Out from
dual;
Years Out
SQL>
last_day()返回包含了日期参数的月份的最后一天的日期
date_value:=last_day(date_value)
SQL> select last_day(date) Leap Yr? from dual;
Leap Yr?
月
SQL> select last_day(sysdate) Last day of this month from dual;
Last day o
月
SQL>
localtimestamp()返回会话中的日期和时间
timestamp_value:=localtimestamp
SQL> column localtimestamp format a
SQL> select localtimestamp from dual;
LOCALTIMESTAMP
月
下午
SQL> select localtimestampcurrent_timestamp from dual;
LOCALTIMESTAMP CURRENT_TIMESTAMP
月 月 下午 +:
下午
SQL> alter session set time_zone=:;
会话已更改
SQL> select localtimestampto_char(sysdateDDMMYYYY HH:MI:SS AM)
SYSDATE from dual;
LOCALTIMESTAMP SYSDATE
月 :: 下午
下午
SQL>
months_between()判断两个日期之间的月份数量
number_value:=months_between(date_valuedate_value)
SQL> select months_between(sysdatedate) from dual;
MONTHS_BETWEEN(SYSDATEDATE)
SQL> select months_between(sysdatedate) from dual;
MONTHS_BETWEEN(SYSDATEDATE)
SQL>
next_day()给定一个日期值返回由第二个参数指出的日子第一次出现在的日期值(应返回相应日子的名称字符串)
?周相?日期函?
查询某周的第一天
select trunc(decode(ww to_date(yy || yyyyddmm)
to_date(yy || || to_char(ww * ) yyyyddd)) d) last_day
from (select substr( ) yy to_number(substr(
)) ww
from dual)
select
trunc(to_date(substr()||to_char((to_number(substr()))*)yyyyddd)d)
first_day from dual
select min(v_date) from
(select (to_date(yyyymm) + rownum) v_date
from all_tables
where rownum < )
where to_char(v_dateyyyyiw) =
查询某周的最后一天
select trunc(decode(ww to_date(yy || yyyyddmm)
to_date(yy || || to_char(ww * ) yyyyddd)) d)
first_day
from (select substr( ) yy to_number(substr(
)) ww
from dual)
select
trunc(to_date(substr()||to_char((to_number(substr()))*)yyyyddd)d)
last_day from dual
select max(v_date) from
(select (to_date(yyyymm) + rownum) v_date
from all_tables
where rownum < )
where to_char(v_dateyyyyiw) =
查询某周的日期
select min_date to_char(min_dateday) day from
(select to_date(substr()||+rownumyyyyddd)
min_date
from all_tables
where rownum <=
decode(mod(to_number(substr())))
union
select to_date(substr()||
decode(mod(to_number(substr())))+rownumyyyyddd)
min_date
from all_tables
where rownum <=
union
select to_date(substr()+||+rownumyyyyddd)
min_date
from all_tables
where rownum <=
)
where to_char(min_dateyyyyiw) =