格式化日期指的是将日期转为字符串,或将字符串转为日期,下面几个函数可以用来格式化日期
TO_CHAR(datetime, 'format')
TO_DATE(character, 'format')
TO_TIMESTAMP(character, 'format')
TO_TIMESTAMP_TZ(character, 'format')
SQL 产生的结果
SELECT TO_CHAR(current_timestamp, 'format') FROM DUAL;
Format
List item
YYYY-MM-DD
YYYY-MON-DD
2015-JUN-15
YYYY-MM-DD HH24:MI:SS FF3
YYYY-MM-DD HH24:MI:SS FF3 TZR
DS
DL
Monday, June 15, 2015
TS
1:18:10 PM
Oracle 支持哪些格式呢?看看下面的表格吧
Format
Description
年的最后一位数字,如:5
YY
年的最后两位数字,如:15
YYY
年的最后三位数字,如:015
YYYY
年,如:2015
Y,YYY
年用逗号分割
SYYYY
YEAR
年拼写,如:TWENTY FIFTEEN
SYEAR
年拼写,如:TWENTY FIFTEEN
ISO年的最后一位数字,如:5
IY
ISO年的最后两位数字,如:15
IYY
ISO年的最后三位数字,如:015
IYYY
ISO年,如:2015
RR
两位数字年,如:15
RRRR
四位数字年,如:2015
MM
Month (01-12)
MON
月份简称,如:JUN
MONTH
月份全称,如:JUNE
RM
罗马数字月份
Day of week (1-7)
DD
Day of month (1-31)
DDD
Day of year (1-366)
HH
Hour of day (1-12)
HH12
Hour of day (1-12)
HH24
Hour of day (0-23)
MI
Minute (0-59)
SS
Second (0-59)
SSSSS
Seconds past midnight
FF [1…9]
毫秒
DS
DL
日期全称,如:Friday, June 12, 2015
TS
CC
世纪,如:21
SCC
世纪,如:21
Quarter of year (1, 2, 3, 4)
Week of month (1-5)
WW
Week of year (1-53)
IW
ISO Week of year (1-52 or 1-53)
DY
星期简称,如:Fri
DAY
星期全称,如:Friday
AM
A.M.
PM
P.M.
AD
A.D.
BC
B.C.
TZD
夏令时
TZR
时区
TZH
时区之时差
TZM
时区之分钟差
EE
era 全称
era 简称
The number of days since January 1, 4712 BC
FM
去掉首尾空格
FX
精确匹配
秒和毫秒分隔符
TH
DDTH --> 4th
SP
DDSP -->FOUR
SPTH
DDSPTH --> FOURTH
THSP
DDTHSP --> FOURTH
默认情况下,Oracle 格式化日期时,有一定的容错性,如下面的 SQL 返回正确的结果。
2. select to_char( to_date(222,'J'),'Jsp') from dual 显示Two Hundred Twenty-Two
4. 两个日期间的天数 select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
5. 时间为null的用法 select id, active_date from table1 UNION select 1, TO_DATE(null) from dual; 注意要用TO_DATE(null)
13.年月日的处理 select older_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, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date from emp ) )
14.处理月份天数不定的办法 select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual
16.找出今年的天数 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual
闰年的处理方法 to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' ) 如果是28就不是闰年
18.不同时区的处理 select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate from dual;
19.5秒钟一个间隔 Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual
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 ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual )
select * from tabname order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss'); // floor((date2-date1) /365) 作为年 floor((date2-date1, 365) /30) 作为月 d(mod(date2-date1, 365), 30)作为日.
25,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型 select sysdate S1, trunc(sysdate) S2, //返回当前日期,无时分秒 trunc(sysdate,'year') YEAR, //返回当前年的1月1日,无时分秒 trunc(sysdate,'month') MONTH , //返回当前月的1日,无时分秒 trunc(sysdate,'day') DAY //返回当前星期的星期天,无时分秒 from dual
26,返回日期列表中最晚日期 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual
28.更新时间 注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-年 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改变时间-月 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-日 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-时 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-分 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改变时间-秒
29.查找月的第一天,最后一天 SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month, Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month, Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month, LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month FROM dual;
select sysdate,sysdate - interval '7' MINUTE from dual
select sysdate - interval '7' hour from dual
select sysdate - interval '7' day from dual
select sysdate,sysdate - interval '7' month from dual
select sysdate,sysdate - interval '7' year from dual
select sysdate,sysdate - 8 *interval '2' hour from dual
2.日期格式化参数详解
2.1 -/,.;: 指定返回字串分隔符
-----------------------------
SQL> select to_char(sysdate,'yyyy+mm=dd') from dual;
TO_CHAR(SYSDATE,'YYYY+MM=DD')
-----------------------------
2015+12=28
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DD')
-----------------------------
2.2 AD/A.D. 公元标识
SQL> select to_char(sysdate,'AD yyyy-mm-dd') from dual;
TO_CHAR(SYSDATE,'ADYYYY-MM-DD'
------------------------------
SQL> select to_char(sysdate,'A.D. yyyy-mm-dd') from dual;
------------------------------
2.3 BC/B.C. 公元标识
SQL> select to_char(sysdate,'B.C. yyyy-mm-dd') from dual;
------------------------------
SQL> select to_char(sysdate,'BC yyyy-mm-dd') from dual;
TO_CHAR(SYSDATE,'BCYYYY-MM-DD'
------------------------------
2.4 AM/A.M. 子午线标识
SQL> select to_char(sysdate,'YYYY-MM-DD AM hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDAMH
------------------------------
2.5 PM/P.M. 子午线标识
SQL> select to_char(sysdate,'YYYY-MM-DD PM hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDPMH
------------------------------
2.6 CC/SCC 世纪标识,S前缀指定如遇公元前的显示,会在显示前加(-)
提示:
如果年份中最后两位数字在01到99(含)之间,则返回值等于年份前两位+1
如果年份中最后两位数字是00,则返回值与年份前两位相同
SQL> select to_char(sysdate,'cc YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'CCYYYY-MM-DDP
------------------------------
2.7 D 获取日期星期几(范围:1-7)
SQL> select to_char(sysdate,'D YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'DYYYY-MM-DDPM
------------------------------
2.8 DD 指定日期在当月中第几天(范围:1-31)
SQL> select to_char(sysdate,'DD YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'DDYYYY-MM-DDP')
------------------------------
2.9 DDD 指定日期在当年中的第几天(范围:1-366)
SQL> select to_char(sysdate,'DDD YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'DDDYYYY-MM-DD')
------------------------------
2.10 DAY 指定日期在周中的名称
select to_char(sysdate,'Day YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'DAYYYYY-MM-DD')
-----------------------------------
2.11 MON 返回指定日期的月份简写
SQL> select to_char(sysdate,'MON YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'MONYYYY-MM-DD')
----------------------------------
2.12 MONTH 返回指定日期的月份全称
SQL> select to_char(sysdate,'MONTH YYYY-MM-DD PM hh24:mi:ss ') from dual;
TO_CHAR(SYSDATE,'MONTHYYYY-MM-')
--------------------------------
2.13 MM 返回指定日期的月份(范围:1-12)
SQL> select to_char(sysdate,'MM') from dual;
TO_CHAR(SYSDATE,'MM')
---------------------
12
2.14 HH 小时(范围:1-12)
SQL> select to_char(sysdate,'HH') from dual;
TO_CHAR(SYSDATE,'HH')
---------------------
06
2.15 HH12 小时(范围:1-12)
select to_char(sysdate,'HH12') from dual;
TO_CHAR(SYSDATE,'HH12')
-----------------------
06
2.16 HH24 小时(范围:0-23)
SQL> select to_char(sysdate,'HH24') from dual;
TO_CHAR(SYSDATE,'HH24')
-----------------------
18
2.17 MI 返回指定时间的分钟(范围0-59)(注意java表示分钟是mm,月份是MM,而Oracle表示分钟是mi,月份是MM)
SQL> select to_char(sysdate,'MI') from dual;
TO_CHAR(SYSDATE,'MI')
---------------------
59
2.18 SS 返回指定时间的秒数(范围:0-59)
SQL> select to_char(sysdate,'SS') from dual;
TO_CHAR(SYSDATE,'SS')
---------------------
13
2.19 FF[1-9] 返回毫秒数,可指定长度1-9,默认6位(Oracle中date类型没有毫秒,用这个格式会报错,timestamp才有毫秒)
SQL> select to_char(SYSTIMESTAMP,'FF9') from dual;
TO_CHAR(SYSTIMESTAMP,'FF9')
---------------------------
487000000
SQL> select to_char(SYSTIMESTAMP,'FF4') from dual;
TO_CHAR(SYSTIMESTAMP,'FF4')
---------------------------
4740
SQL> select to_char(SYSTIMESTAMP,'FF6') from dual;
TO_CHAR(SYSTIMESTAMP,'FF6')
---------------------------
032000
2.20 Y,YYY 返回有逗号分隔显示的年
SQL> select to_char(SYSTIMESTAMP,'Y,YYY') from dual;
TO_CHAR(SYSTIMESTAMP,'Y,YYY')
-----------------------------
2,015
2.21 Y/YY/YYY/YYYY 以指定长度返回日期的年份
SQL> select to_char(sysdate,'Y') from dual;
TO_CHAR(SYSDATE,'Y')
--------------------
SQL> select to_char(sysdate,'YY') from dual;
TO_CHAR(SYSDATE,'YY')
---------------------
15
SQL> select to_char(sysdate,'YYY') from dual;
TO_CHAR(SYSDATE,'YYY')
----------------------
015
SQL> select to_char(sysdate,'YYYY') from dual;
TO_CHAR(SYSDATE,'YYYY')
-----------------------
2015
2.22 W 返回指定日期在当月中的第X周(范围:1-5)
SQL> select to_char(sysdate,'W') from dual;
TO_CHAR(SYSDATE,'W')
--------------------
2.23 WW 返回指定日期在当年中的第X周(范围:1-53)
SQL> select to_char(sysdate,'WW YYYY-MM-DD') from dual;
TO_CHAR(SYSDATE,'WWYYYY-MM-DD'
------------------------------
2.24 IW 指定日期在当年中第X周(范围:1-52或1-53(润年))
SQL> select to_char(sysdate,'IW YYYY-MM-DD') from dual;
TO_CHAR(SYSDATE,'IWYYYY-MM-DD'
------------------------------
2.25 Q 返回指定日期的季度(范围:1-4)
SQL> select to_char(sysdate,'Q YYYY-MM-DD') from dual;
TO_CHAR(SYSDATE,'QYYYY-MM-DD')
------------------------------
2.26 DY 返回星期简写(也可以用DAY)
SQL> select to_char(sysdate,'DY YYYY-MM-DD') from dual;
TO_CHAR(SYSDATE,'DYYYYY-MM-DD'
------------------------------
SQL> alter session set nls_language='AMERICAN';
Session altered
SQL> select to_char(sysdate,'dy') from dual;