PL SQL - 将时间戳转换为日期时间/日期

时间:2017-07-07 20:03:15

标签: sql oracle plsql timestamp date-conversion

select 
to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as SCHEDULED_TIME,
TRUNC(to_date(to_timestamp(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF'),'YYYY-MM-DD HH24:MI:SS'))
from S_TIDAL_STATUS

错误是: ORA-01830:日期格式图片在转换整个输入字符串之前结束 01830. 00000 - “日期格式图片在转换整个输入字符串之前结束”

目标是返回类似

的内容

2017-07-91 23:14:00 (没有点后面的内容)。

以下是SCHEDULED_TIME(时间戳)的样子: enter image description here

2 个答案:

答案 0 :(得分:5)

您尝试的问题是应用于时间戳的函数TO_DATE()。 TO_DATE()接受VARCHAR2(字符串)输入,而不是时间戳。因此Oracle首先使用您的NLS_TIMESTAMP_FORMAT参数隐式地将时间戳转换为字符串,然后尝试将此字符串转换为日期。根据您的NLS_TIMESTAMP_FORMAT,您可能会遇到不同的错误。

将时间戳转换为日期(日期时间)的方法 - 截断一秒的分数 - 是使用CAST函数。例如:

select systimestamp, 
       cast (systimestamp as date) as ts_cast_to_date
from   dual
;

或者,如果您的所有字符串都以该格式显示,则可以先截断字符串并直接应用TO_DATE:

to_date(substr(scheduled_time, 1, 19), 'yyyy-mm-dd hh24:mi:ss')

答案 1 :(得分:2)

这应该可以解决问题:

select 
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS.FF') as time_to_csecs,
to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS') as time_to_secs,
TRUNC(to_date(to_char(SCHEDULED_TIME,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS')) as time_to_day
from S_TIDAL_STATUS

请查看文档,了解to_timestamp和to_char之间的区别。