当前位置:网站首页>Oracle日期格式转换 to_date,to_char,to_timetamp 相互转换
Oracle日期格式转换 to_date,to_char,to_timetamp 相互转换
2022-07-05 18:33:00 【HaHa_Sir】
Oracle日期格式转换 to_date,to_char,to_timetamp 相互转换
一、概述
1、本文主要记录Oracle数据库中,常见的日期格式转换。使用 to_char函数,将日期转换为字符串;使用 to_date 、to_timetamp 函数,将字符串转换为对应的日期类型。
2、Oracle 数据库版本是:Oracle 11g。
二、日期转换字符串 to_char
1、常用的2个日期函数:SYSDATE , SYSTIMESTAMP
SELECT SYSDATE , SYSTIMESTAMP FROM dual ;
2、SYSDATE 转字符串
SELECT
SYSDATE
, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh:mm:ss') AS "h12" -- 12小时制
, TO_CHAR(SYSDATE, 'yyyy-mm-dd hh24:mi:ss') AS "h24" -- 24小时制度
FROM dual ;
3、SYSTIMESTAMP 转字符串
SELECT
SYSTIMESTAMP
, TO_CHAR(SYSTIMESTAMP, 'yyyy-mm-dd hh24:mi:ss') AS "h24" -- 24小时
, TO_CHAR(SYSTIMESTAMP, 'yyyy-mm-dd hh24:mi:ss.ff3') AS "h24mi" -- 24小时mi
FROM
dual ;
4、SYSDATE 常用转换
SELECT
TO_CHAR(SYSDATE , 'yyyy') AS 年份 ,
TO_CHAR(to_date('2022-07-01', 'yyyy-mm-dd'), 'q') AS 季度 ,
TO_CHAR(SYSDATE , 'mm') AS 月份 ,
TO_CHAR(SYSDATE , 'dd') AS 日, -- 每月的第几天
TO_CHAR(SYSDATE , 'd') AS "日(周)", -- 每周第几天(第一天是周日)
TO_CHAR(SYSDATE , 'ddd') AS "日(年)" , -- 每年的第几天
TO_CHAR(SYSDATE , 'ww') AS "周(年)", -- 每年的第几周
TO_CHAR(to_date('2022-01-08', 'yyyy-mm-dd') , 'ww') AS "周(年)" -- 每年的第几周
FROM
dual ;
三、字符串转换为日期
1、to_date 字符串转 日期:
SELECT
TO_DATE('2022-06-20 17:08:06' , 'yyyy-mm-dd hh24:mi:ss') AS "date"
FROM
dual ;
2、TO_TIMESTAMP 字符串转 日期:
SELECT
TO_TIMESTAMP('2022-06-20 17:08:06.114', 'yyyy-mm-dd hh24:mi:ss.ff3') AS "t1"
, TO_TIMESTAMP('2022-06-20 17:08:06', 'yyyy-mm-dd hh24:mi:ss') AS "t1"
FROM
dual ;
四、总结
1、Oracle中,日期转换为字符串:使用to_char函数即可实现,但to_char函数还支持更多的格式转换,可以参考的参数如下:
【第一个参数为数字类型】
序号 | 格式 | 简例 | 说明 |
1 | ,(逗号) | '9999,999' | 逗号,一般以千分位出现,作为分组符号使用.如果需要您也可以当作是十分位,百分位出现,可以出现N次,视乎数字的大小而定. |
变态的例子是 to_char(1234,'9,9,9,9'). | |||
注意事项:只能出现在整数部分. | |||
2 | .(点号) | '99.99' | 点号,不要念为"句号",句号是个圆圈,点好只能出现在小数点对应的地方.只能出现一次. |
to_char(1234.34,'9,9,9,9.99') | |||
注意事项:只能出现在一个地方,就是原来数据小数点位置 | |||
3 | $(美元符号) | '$999.99' | 美元.其实你可以放在任意地方(在10G下) |
to_char(1234.34,'9,9,9,9.$99') | |||
注意事项:只能出现一次. | |||
4 | 0(零) | '0999.99' | 零.在对应位置返回对应的字符,如果没有则以'0'填充. |
to_char(0.34,'9,9,9,0.$99')='$0.34';to_char(1234,'9999.00')='1234.00'; | |||
注意事项:这是一个强制的符号,对应位没有,则以'o'填充,这是9很大不同地方 | |||
5 | 9 | '999.99' | 9.在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符. |
to_char(123,'999.99')=123.00; TO_CHAR(123,'99999.9')=123.0; | |||
注意事项:对于0和9而言,如果格式的位数不如数字的位数多,会返回'#'. | |||
譬如to_char(12345,'9999')='#####' | |||
6 | B(空格符) | 'B999' | 没有其它特别作用,在整数部分最前面加一个空格,可以出现在任意位置. |
'S'||TO_CHAR(1234,'99B99')='S 1234'; | |||
注意事项:只能出现在整数部位. | |||
7 | C(国际货币符号) | 'C9999' | 在特定的位置返回一个ISO货币符号(就是NLS_ISO_CURRENCY参数所代表的值) |
TO_CHAR(1233,'C9999')='CNY1234' ,这是新的国际标准RMB,关于这个可查询"国际货币符号" | |||
注意事项:只能出现在整数部位第一位. | |||
可以通过alter session set NLS_ISO_CURRENCY='JAPAN';来修改当前会话的设置. | |||
8 | D(ISO 小数位符号) | '999D99' | 这是"点号"的国际版本(ISO),作用等同于点号,也是只能出现一次.所不同的是,数据库会根据NLS_NUMERIC_CHARACTER的参数值来设置内容.默认的这个值是点号. |
注意事项:没有特别需要一般不要用这个格式符号.也不要轻易修改参数值. | |||
也可用alter sesssion set 来修改. | |||
alter session set nls_numeric_characters='!,'; to_char(1234.34,'9999d99')=1234!34 | |||
9 | EEEE(科学计算符) | 9.9EEEE | 科学计算符号 |
TO_CHAR(2008032001,'9.9EEEE')='2.01E+09',由于是科学计算方法,所以小数位前面加一个9或者0即可,多个是没有意义的. | |||
10 | G(分组符号) | 999G999 | 是逗号(,)的的ISO标准,作为分组符号使用,可以放在多个地方使用. |
TO_CHAR(123456,'999G9G99')=123,4,56 | |||
注意事项:同第八项 -D, 此外如果要转换出小数点,则要和D配合使用,不能和点号配合. | |||
11 | L(本地货币符号) | 'L999' | 是C的本地版本.可以放在整个格式的最前面和最后面. |
TO_CHAR(123456,'999G9G99D00L')=123,4,56.00¥ | |||
注意事项:同第七项 C | |||
12 | MI(负号) | '9999MI' | 如果是负数,在尾部加上负号(-),如果是正数,则尾巴加上空格 |
to_char(1234,'9999mi')||'S'||TO_CHAR(-5678,'9999MI') =1234 S5678- | |||
注意事项:只能放在格式尾巴 | |||
13 | PR(符号) | 9999PR | 是表达负数的另外一种方式.如果是正数,则头部加上空格;如果是负数,则用小简括号<>把数字包起来. |
TO_CHAR(-1234.89,'9G999D00PR')=<1,234.89> | |||
注意事项:同12 | |||
14 | RN(rn) | RN(rn) | 把整数(1-3999)转换为罗马字符.RN表示转为大写,rn表示小写的. |
declare | |||
i int; | |||
begin | |||
for i in 1..20 loop | |||
dbms_output.put_line(to_char(i,'RN')); | |||
end loop; | |||
end; | |||
注意事项:只能自己使用,不能和其它符号组合使用. | |||
15 | S | '9999S' | 是12,13的综合改进版本.为整数加一个正号+,为负数加一个符号-.S在前则加在前,在后则在后. |
TO_CHAR(-1234,'S9999')=-1234;TO_CHAR(1234,'S9999')=+1234 | |||
16 | TM | TM9/TMe | 使用这个参数等于没有用参数to_char(number)一样,应为'tm9'是默认的格式参数. |
to_char(1234,'tme')=1234 | |||
注意事项:格式要么是TM9,要么是TME. | |||
当数字长度超过64位时候,TM9的输出等同于TME的输出. | |||
17 | U | U999 | 双币符号,例如欧元.作用同11的L |
TO_CHAR(999,'U999')=¥999 | |||
注意事项:通过NLS_DUAL_CURRENCY 控制 | |||
18 | V | 999V9 | 这是个比较古怪,又不是很常使用的符号。它的作用在于做一个计算。 |
例如TO_CHAR(N,'999V9'),以p表示V的位置,则该表达式=to_char(N×(10的P-1次方)).但是9个数又必须保证大于等于乘积之后表示的位数. | |||
TO_CHAR(5,'9V')=5*1=5; | |||
TO_CHAR(5,'9V9')=5*10=50 | |||
TO_CHAR(5,'9V99')=500 | |||
TO_CHAR(50,'9V99')='######' 9的个数不够 | |||
注意事项:格式中不能和小数表达写在一起,但是可以混合货币等。 | |||
19 | X | xxxx | 转换为16进制。 |
TO_CHAR(100,'XX')= 64 | |||
注意事项:数值必须是大于等于0的整数。前面只能和0或者FM组合使用. | |||
20 |
|
| 通过以上的例子,我们了解了各种数字的格式。可以说格式太多样,难于记在脑子,最好是作为一个参考存在着. |
归类: | |||
数值类: 0,9, | |||
分组类: (.),(,),D,G ,其中点好和逗号因为表示不明显,所以用小括号凸显。 | |||
货币类: $,C,L,U | |||
计算转换类:EEEE,RN,V,X | |||
正负符号:MI,PR,S | |||
其它类:B | |||
正统类:TM |
【第一个参数为:日期类型时】
序号 | 格式 | 简例 | 说明 |
1 | - / , . ; : | 略 | 时间分隔符号,除了标准的几个,还允许用文字作为分割符号。 |
"text" | 例如 to_char(sysdate,'YYYY"年"mm"月"dd"日"')=2008年04月24日 | ||
2 | AD |
| 即拉丁文Anno Domini的简写,表示公元.会根据nls的不同转换为公元或者ad等 |
A.D. | 无特殊注意事项 | ||
3 | AM |
| 上午的简写 ,同pm, p.m. (下午) , 中文环境输出为上午(如果是上午) |
A.M. | |||
4 | BC |
| 虽然标准的写法是B.c. (c小写) 或者BC,好在Oracle不讲究这个。表示公元前 |
B.C. | |||
5 | CC |
| 返回世纪,以阿拉伯数字表示 |
SCC | 如果年的后两位介于01-99那么,返回前两位+1,否则返回前两位 | ||
6 | D |
| 一周之中的某天,返回的是序号1-7 |
7 | DAY |
| 一周之中的某天,不过返回的是星期几而已,这和语言设置有关系,在中国环境 NLS_DATE_LANGUAGE=SIMPLIFIED CHINESE ,用星期一到星期天表示 |
8 | DD |
| 月份中的某天(1-31) |
9 | DDD |
| 年份中的某天(1-366) |
10 | DL | 'DL' | 返回长的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。例 2008年4月28日 星期一 |
限制:除了DL,其它什么的都不能设置。 | |||
11 | DS |
| 返回短的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。 例如 2008-04-28 |
限制:除了DL,其它什么的都不能设置。 | |||
12 | DY |
| 日期的简称,就是星期几(当然这指的是中国环境下) |
13 | E |
| 纪元简称,但是只适合以下集中日历:日本皇室,中华民国,太过佛历 |
14 | EE |
| 纪元全程,适合情况同E |
15 | FF [1..9] |
| 就是毫秒,如果不更上数字就是用默认的精度。 |
只能用于timestamp类型的。 | |||
16 | FM |
| 值得注意的一个函数:不返回任何内容。 |
有点不明白oracle为什么设置这个东西. | |||
17 | FX |
| 同上 |
18 | HH |
| 表示小时,为12小时制,同hh12(1-12) |
19 | HH12 |
| 表示小时,为12小时制(1-12) |
20 | HH24 |
| 表示小时,为24小时制(0-23) |
21 | IW |
| ISO标准的星期序号(1-52,或者1-53) |
22 | IYYY |
| IYY,IY,I, ISO年(4位)的4,3,2,1位数字(倒数) |
IYY | to_char(to_date(21120401,'yyyymmdd'),'iyyy, iyy,iy,i')=2112, 112,12,2 | ||
IY |
| ||
I |
| ||
23 | J |
| 儒略日(多用于天文的一种日历),从公元前4712年一月一日算起,得出的结果是个整数,算法大体为 (公元日期+4712)*儒略日历年平均天数 |
24 | MI |
| 秒(0-59) |
25 | MM |
| 2位月(1-12) |
26 | MON |
| 月的简称,和国家有关系NLS_DATE_LANGUAGE,例如04在中文环境下用4月表示. |
27 | MONTH |
| 月的名称,国家有关系NLS_DATE_LANGUAGE,目前在中文下04表示为4月。 |
28 | PM |
| 同am,a.m.表示下午 |
P.M. | |||
29 | Q |
| 季度(1-4) |
30 | RM |
| 用罗马数字表示的月份,I ,II ,III ,IV ,V ,VI ,VII ,VIII,IX ,X ,XI ,XII |
31 | RR |
| 有点四舍五入表示年的意思,具体的用法有那么一点点复杂。 |
以s表示输入的年份最后两位,c表示当前的年份最后两位,其输出结果(新的年份前两位)可以用函数r=f(s,c)来表示,s2,c2分别表示s,c的前两位。 | |||
1)s=[0,49],c=[0,49],则r=c2 | |||
2) s=[0,49],c=[50,99],则 r=c2+1 | |||
3) s=[50,99],c=[0,49],则r=c2-1 | |||
4) s=[50,99],c=[50,99],则 r=c2 | |||
简而言之就是靠近当前年份原则,如果和当前年份同区域那么就一样,如果比当前区域大,那么就是当作是当前世纪前一世纪,否则就是下一个世纪。 | |||
举例来说,以to_date为例子 | |||
SQL> select to_date('89-01-01','rr-mm-dd') ,to_date('12-01-01','rr-mm-dd') FROM DUAL; | |||
| |||
TO_DATE('89-01-01','RR-MM-DD') TO_DATE('12-01-01','RR-MM-DD') | |||
------------------------------ ------------------------------ | |||
1989-01-01 2012-01-01 | |||
我想oracle会搞这个东东出来,估计有两个考虑一个是为了方便,一个是为了对付百年或者千年问题。 | |||
32 | RRRR |
| 如果输入参数只有两位,则同rr,否则就同yyyy作用. |
33 | SS |
| 秒(0-59),一分钟内 |
34 | SSSSS |
| 一天从午夜开始的累积秒数.(0-86399) |
35 | TS |
| 返回短日期格式内容,包括时分秒等,只能和dl,ds组合使用,格式是: |
dl ts或者dl ts ,中间以空格间隔开。TO_CHAR(SYSDATE,'TS')=下午 4:50:04 | |||
表现形式受NLS_TERRITORY 和NLS_LANGUAGE影响。 | |||
36 | TZD |
| 夏令时制信息,时区简写加上夏令时信息,必须和格式tzr设置的时区对应。 |
包括下面三个TZ开头的,都是和时区相关,并不是直接用在to_char | |||
37 | TZH |
| 时区中的小时,例如hh:mi:ss.fftzh:tzm' |
38 | TZM |
| 时区中的分钟. |
39 | TZR |
| 时区中的区域信息,必须是数据库支持的时区,例如US/Pacific |
40 | WW |
| 和iw类似,也是表示星期的序号,从年的第一天算起到年的最后一个第七天。二者取值基本相同。(1-53) ,例如2008-01-01 到2008-01-07 算1,2008-01-09~2008-01-13 算2 |
41 | W |
| 一个月中的星期序号,其算法同ww,不过是局限在一月之内而已,和iso的不同。 |
42 | X |
| 代表本地根符号,没有特别用处,只能和timestamp类型一起使用. |
43 | Y,YYY |
| 四位年,用都好分隔 例如2,008 |
44 | YEAR |
| 发音表达的年,例如 2008=two thousand eight |
SYEAR | S前缀表示公元前BC | ||
45 | YYYY |
| 四位年,S前缀表示公元前BC |
SYYYY | |||
46 | YYY |
| 一次表示后面3,2,1位的年,例如2008 可以分别取值为008,08,8 |
YY | |||
Y | |||
| 总结 |
| 从以上看,主要就是表示时间几个部分的格式:世纪、年,月,日,时,分,秒,毫秒,以及其它一些混合格式。每个时间部分都可以有多种的表达方式,通过这样归类就比较容易记忆。 |
很多格式可以组合使用,这样最终可以形成足够丰富的表达其形势; | |||
其次很多格式和nls是密切相关的;最后某些输出(返回)和格式大小写是有关系的,这在中文环境下体现不出来(目前来没有看到),但是english环境下就名下,以to_char(sysdate,'day')为例子,如果是西文环境是返回sun(假设sysdate位于周末),如果to_char(sysdate,'DAY')则返回SUN |
2、注意:SYSDATE , SYSTIMESTAMP 函数的时间精度不一样;SYSDATE 精确到秒; SYSTIMESTAMP 是可以精确到秒的后6位。
边栏推荐
- Thoroughly understand why network i/o is blocked?
- @Extension、@SPI注解原理
- @Extension, @spi annotation principle
- About statistical power
- About Estimation with Cross-Validation
- Electron installation problems
- Personal understanding of convolutional neural network
- Take a look at semaphore, the current limiting tool provided by JUC
- Quickly generate IPA package
- 开户注册挖财安全吗?有没有风险的?靠谱吗?
猜你喜欢
@Extension、@SPI注解原理
Use of websocket tool
【HCIA-cloud】【1】云计算的定义、什么是云计算、云计算的架构与技术说明、华为云计算产品、华为内存DDR配置工具说明
爬虫01-爬虫基本原理讲解
Thoroughly understand why network i/o is blocked?
Case sharing | integrated construction of data operation and maintenance in the financial industry
进程间通信(IPC):共享内存
Use JMeter to record scripts and debug
瀚升优品app翰林优商系统开发功能介绍
【Autosar 十四 启动流程详解】
随机推荐
buuctf-pwn write-ups (9)
Login and connect CDB and PDB
如何写出好代码 - 防御式编程
Maximum artificial island [how to make all nodes of a connected component record the total number of nodes? + number the connected component]
Nacos distributed transactions Seata * * install JDK on Linux, mysql5.7 start Nacos configure ideal call interface coordination (nanny level detail tutorial)
The 10th global Cloud Computing Conference | Huayun data won the "special contribution award for the 10th anniversary of 2013-2022"
基于can总线的A2L文件解析(3)
sample_ What is the relationship between rate, sample and duration
【在優麒麟上使用Electron開發桌面應】
进程间通信(IPC):共享内存
爬虫01-爬虫基本原理讲解
Use of print function in MATLAB
New words new words new words new words [2]
写作写作写作写作
The easycvr platform reports an error "ID cannot be empty" through the interface editing channel. What is the reason?
Use QT to traverse JSON documents and search sub objects
All you want to know about clothing ERP is here
如何获取飞机穿过雷达两端的坐标
LeetCode 6109. 知道秘密的人数
案例分享|金融业数据运营运维一体化建设