Oracle SQL中Timestamp转Date:将特定格式时间戳转换为目标日期格式
搞定Oracle Timestamp转指定格式Date的问题
嘿,针对你要把格式为07-JUN-17 11.00.00.000000000 AM的Timestamp类型值转成07-JUN-17 11.00.00 AM格式的Date类型需求,我给你整理了两种实用的方法:
先提前说个关键点:Oracle的DATE类型本身是不存储显示格式的,它是后台的数值型存储。我们要做的核心是去掉Timestamp里的纳秒部分,转换成Date类型,之后如果需要固定显示格式,再用格式化函数调整就行。
方法1:用TRUNC截断纳秒(简单直接)
TRUNC函数可以直接把Timestamp截断到秒级,然后转成Date就搞定了:
SELECT CAST(TRUNC(your_timestamp_column, 'SS') AS DATE) AS converted_date FROM your_table;
TRUNC(..., 'SS')会把Timestamp后面那串长长的纳秒全部清零,只保留到秒- 用
CAST把处理后的Timestamp转成Date类型
要是你需要确保显示出来就是07-JUN-17 11.00.00 AM这个样式,就配合TO_CHAR函数:
SELECT TO_CHAR(CAST(TRUNC(your_timestamp_column, 'SS') AS DATE), 'DD-MON-RR HH.MI.SS AM') AS formatted_date FROM your_table;
注意哈,TO_CHAR返回的是字符串类型,如果只需要Date类型的字段,第一个语句就够用了,显示格式可以通过客户端的NLS设置或者TO_CHAR来控制。
方法2:字符串中转法(精准控格式)
先把Timestamp转成不带纳秒的字符串,再转成Date类型,这种方法能彻底避开NLS设置的影响:
SELECT TO_DATE(TO_CHAR(your_timestamp_column, 'DD-MON-RR HH.MI.SS AM'), 'DD-MON-RR HH.MI.SS AM') AS converted_date FROM your_table;
- 第一步
TO_CHAR把Timestamp格式化为你想要的、去掉纳秒的字符串 - 第二步
TO_DATE把这个字符串转成Date类型
小提醒
- 记得确认你的Oracle会话的
NLS_DATE_FORMAT和NLS_TIMESTAMP_FORMAT设置和你的格式匹配,或者像上面这样在函数里明确写格式掩码,避免转换出错 - 格式里的
RR是用来处理两位年份的,会根据当前年份自动推断世纪(比如17会被识别为2017)
内容的提问来源于stack exchange,提问作者jayanth




