数据库

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

Oracle日期时间函数的应用


发布日期:2021年10月03日
 
Oracle日期时间函数的应用

转换函数

与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) =

               

上一篇:Oracle数据库中Rman操作简单分析

下一篇:Oracle建立DBLINK的详细步骤记录