ORACLE日期函数011Word格式.docx
《ORACLE日期函数011Word格式.docx》由会员分享,可在线阅读,更多相关《ORACLE日期函数011Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
![ORACLE日期函数011Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/16/f14dfc5a-a365-43f5-96b4-3cad652353a0/f14dfc5a-a365-43f5-96b4-3cad652353a01.gif)
44
Wdigit当月第几周显示值:
1
24小时格式下时间范围为:
0:
00:
00-23:
59:
59....
12小时格式下时间范围为:
1:
00-12:
59....
1.日期和字符转换函数用法(to_date,to_char)
selectto_char(sysdate,'
yyyy-mm-ddhh24:
mi:
ss'
)asnowTimefromdual;
//日期转化为字符串
yyyy'
)asnowYearfromdual;
//获取时间的年
mm'
)asnowMonthfromdual;
//获取时间的月
dd'
)asnowDayfromdual;
//获取时间的日
hh24'
)asnowHourfromdual;
//获取时间的时
mi'
)asnowMinutefromdual;
//获取时间的分
)asnowSecondfromdual;
//获取时间的秒
selectto_date('
2004-05-0713:
23:
44'
'
)fromdual//
2.
selectto_char(to_date(222,'
J'
),'
Jsp'
)fromdual
显示TwoHundredTwenty-Two
3.求某天是星期几
selectto_char(to_date('
2002-08-26'
yyyy-mm-dd'
day'
)fromdual;
星期一
NLS_DATE_LANGUAGE=American'
monday
设置日期语言
ALTERSESSIONSETNLS_DATE_LANGUAGE='
AMERICAN'
;
也可以这样
TO_DATE('
'
YYYY-mm-dd'
)
4.两个日期间的天数
selectfloor(sysdate-to_date('
20020405'
yyyymmdd'
))fromdual;
5.时间为null的用法
selectid,active_datefromtable1
UNION
select1,TO_DATE(null)fromdual;
注意要用TO_DATE(null)
6.月份差
a_datebetweento_date('
20011201'
)andto_date('
20011231'
那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
所以,当时间需要精确的时候,觉得to_char还是必要的
7.日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型,比如:
US7ASCII,date格式的类型就是:
'
01-Jan-01'
altersystemsetNLS_DATE_LANGUAGE=American
altersessionsetNLS_DATE_LANGUAGE=American
或者在to_date中写
注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,
可查看
select*fromnls_session_parameters
select*fromV$NLS_PARAMETERS
8.
selectcount(*)
from(selectrownum-1rnum
fromall_objects
whererownum<
=to_date('
2002-02-28'
)-to_date('
2002-
02-01'
)+1
)
whereto_char(to_date('
2002-02-01'
)+rnum-1,'
D'
notin('
1'
7'
查找2002-02-28至2002-02-01间除星期一和七的天数
在前后分别调用DBMS_UTILITY.GET_TIME,让后将结果相减(得到的是1/100秒,而不是毫秒).
9.查找月份
selectmonths_between(to_date('
01-31-1999'
MM-DD-YYYY'
),to_date('
12-31-1998'
))"
MONTHS"
FROMDUAL;
1
02-01-1999'
1.03225806451613
10.Next_day的用法
Next_day(date,day)
Monday-Sunday,forformatcodeDAY
Mon-Sun,forformatcodeDY
1-7,forformatcodeD
11
selectto_char(sysdate,'
hh:
)TIMEfromall_objects
注意:
第一条记录的TIME与最后一行是一样的
可以建立一个函数来处理这个问题
createorreplacefunctionsys_datereturndateis
begin
returnsysdate;
end;
selectto_char(sys_date,'
)fromall_objects;
12.获得小时数
extract()找出日期或间隔值的字段值
SELECTEXTRACT(HOURFROMTIMESTAMP'
2001-02-162:
38:
40'
)fromoffer
SQL>
selectsysdate,to_char(sysdate,'
hh'
SYSDATETO_CHAR(SYSDATE,'
HH'
-----------------------------------------
2003-10-1319:
35:
2107
HH24'
-------------------------------------------
2119
13.年月日的处理
selectolder_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,
older_date
from(
selecthiredateolder_date,add_months(hiredate,rownum)+rownumnewer_date
fromemp
14.处理月份天数不定的办法
selectto_char(add_months(last_day(sysdate)+1,-2),'
),last_day(sysdate)fromdual
16.找出今年的天数
selectadd_months(trunc(sysdate,'
year'
),12)-trunc(sysdate,'
闰年的处理方法
to_char(last_day(to_date('
02'
||:
year,'
mmyyyy'
)),'
如果是28就不是闰年
17.yyyy与rrrr的区别
YYYY99TO_C
-----------
yyyy990099
rrrr991999
yyyy010001
rrrr012001
18.不同时区的处理
selectto_char(NEW_TIME(sysdate,'
GMT'
EST'
),'
dd/mm/yyyyhh:
),sysdate
fromdual;
19.5秒钟一个间隔
SelectTO_DATE(FLOOR(TO_CHAR(sysdate,'
SSSSS'
)/300)*300,'
),TO_CHAR(sysdate,'
fromdual
2002-11-19:
55:
0035786
SSSSS表示5位秒数
20.一年的第几天
selectTO_CHAR(SYSDATE,'
DDD'
),sysdatefromdual
3102002-11-610:
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
(
trunc(sysdate)Days,
sysdate-trunc(sysdate)A
select*fromtabname
orderbydecode(mode,'
FIFO'
1,-1)*to_char(rq,'
yyyymmddhh24miss'
);
//
floor((date2-date1)/365)作为年
floor((date2-date1,365)/30)作为月
d(mod(date2-date1,365),30)作为日.
23.next_day函数返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日
next_day(sysdate,6)是从当前开始下一个星期五。
后面的数字是从星期日开始算起。
1234567
日一二三四五六
---------------------------------------------------------------
select(sysdate-to_date('
2003-12-0312:
45'
))*24*60*60fromddual
日期返回的是天然后转换为ss
24,round[舍入到最接近的日期](day:
舍入到最接近的星期日)
selectsysdateS1,
round(sysdate)S2,
round(sysdate,'
)YEAR,
month'
)MONTH,
)DAYfromdual
25,trunc[截断到最接近的日期,单位为天],返回的是日期类型
selectsysdateS1,
trunc(sysdate)S2,//返回当前日期,无时分秒
trunc(sysdate,'
)YEAR,//返回当前年的1月1日,无时分秒
)MONTH,//返回当前月的1日,无时分秒
)DAY//返回当前星期的星期天,无时分秒
26,返回日期列表中最晚日期
selectgreatest('
01-1月-04'
04-1月-04'
10-2月-04'
27.计算时间差
注:
oracle时间差是以天数为单位,所以换算成年月,日
selectfloor(to_number(sysdate-to_date('
2007-11-0215:
03'
))/365)asspanYearsfromdual//时间差-年
selectceil(moths_between(sysdate-to_date('
)))asspanMonthsfromdual//时间差-月
)))asspanDaysfromdual//时间差-天
))*24)asspanHoursfromdual//时间差-时
))*24*60)asspanMinutesfromdual//时间差-分
))*24*60*60)asspanSecondsfromdual//时间差-秒
28.更新时间
oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日
),to_char(sysdate+n*365,'
)asnewTimefromdual//改变时间-年
),add_months(sysdate,n)asnewTimefromdual//改变时间-月
),to_char(sysdate+n,'
)asnewTimefromdual//改变时间-日
),to_char(sysdate+n/24,'
)asnewTimefromdual//改变时间-时
),to_char(sysdate+n/24/60,'
)asnewTimefromdual//改变时间-分
),to_char(sysdate+n/24/60/60,'
)asnewTimefromdual//改变时间-秒
29.查找月的第一天,最后一天
SELECTTrunc(Trunc(SYSDATE,'
MONTH'
)-1,'
)First_Day_Last_Month,
Trunc(SYSDATE,'
)-1/86400Last_Day_Last_Month,
)First_Day_Cur_Month,
LAST_DAY(Trunc(SYSDATE,'
))+1-1/86400Last_Day_Cur_Month
FROMdual;
三.字符函数(可用于字面字符或数据库列)
1,字符串截取
selectsubstr('
abcdef'
1,3)fromdual
2,查找子串位置
selectinstr('
abcfdgfdhd'
fd'
3,字符串连接
select'
HELLO'
||'
helloworld'
4,1)去掉字符串中的空格
selectltrim('
abc'
)s1,
rtrim('
zhang'
)s2,
trim('
zhang'
)s3fromdual
2)去掉前导和后缀
selecttrim(leading9from9998767999)s1,
trim(trailing9from9998767999)s2,
trim(9from9998767999)s3fromdual;
5,返回字符串首字母的Ascii值
selectascii('
a'
6,返回ascii值对应的字母
selectchr(97)fromdual
7,计算字符串长度
selectlength('
8,initcap(首字母变大写),lower(变小写),upper(变大写)
selectlower('
ABC'
)s1,
upper('
def'
)s2,
initcap('
efg'
)s3
9,Replace
selectreplace('
abc'
b'
xy'
10,translate
selecttranslate('
xx'
--x是1位
11,lpad[左添充]rpad[右填充](用于控制输出格式)
selectlpad('
func'
15,'
='
)s1,rpad('
-'
)s2fromdual;
selectlpad(dname,14,'
)fromdept;
12,decode[实现if..then逻辑]注:
第一个是表达式,最后一个是不满足任何一个条件的值
selectdeptno,decode(deptno,10,'
20,'
2'
30,'
3'
其他'
例:
selectseed,account_name,decode(seed,111,1000,200,2000,0)fromt_userInfo//如果seed为111,则取1000;
为200,取2000;
其它取0
selectseed,account_name,decode(sign(seed-111),1,'
bigseed'
-1,'
littleseed'
equalseed'
)fromt_userInfo//如果seed>
111,则显示大;
为200,则显示小;
其它则显
示相等
13case[实现switch..case逻辑]
SELECTCASEX-FIELD
WHENX-FIELD<
40THEN'
X-FIELD小于40'
WHENX-