2017-07-07 204 views
3
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 - “日期格式图象变换结束整个输入字符串之前”PL SQL - 转换时间戳的日期时间/日期

的目标是回到类似

2017-07-91 23时十四分00秒 (不点后的内容)。

下面介绍一下SCHEDULED_TIME(时间戳)看起来像: enter image description here

+0

嗨,你尝试过** TO_CHAR(SCHEDULED_TIME” YYYY-MM-DD HH24:MI:SS')**? – hmmftg

+0

您不需要PL/SQL。看起来像一个普通的SQL问题。 –

回答

1

这应该做的伎俩:

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之间的差异。

+0

嗯什么是它必须首先转换为字符串的原因?只是好奇 –

+0

@AnnaHuang如果您没有将时间戳转换为字符串,则sqldeveloper将根据NLS_TIMESTAMP_FORMAT(对于时间戳)或NLS_DATE_FORMAT(对于日期)的当前设置显示一个字符串。从本质上讲,sqldeveloper(和sqlplus以及其他任何adhoc应用程序)将使用所选择的Oracle API通过告知API执行转换来将所有数据类型强制转换为字符串。换句话说,该应用程序告诉Oracle在原始(db)数据类型中返回字符串而不是值。它让人们更容易编写像sqldeveloper和sqlplus这样的应用程序。 – jeff6times7

+0

@ jeff6times7 - 实际上它是Oracle数据库引擎本身将执行隐式转换,而不是前端(SQL Developer或SQL \ * Plus)。但否则解释是正确的。 – mathguy

4

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

将时间戳转换为日期(datetime)的方法 - 截断秒的小数部分 - 使用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')