2016-01-21 118 views
0

我需要您帮助转换Oracle日期。Oracle - 日期格式

我有一个专门存储日期这样的列20150731 00:00:34.220。不过,我想显示这样的列像这样20150731,但是当我运行一个简单的选择语句来测试输出时,我得到以下错误。

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

错误

ORA-01830:转换整个输入串

+0

嗨 - 列的数据类型是VARCHAR2。 – netraider

+2

“**存储**这样的日期......”如果它存储的数据不是日期列,但是您可能会混淆日期的默认显示方式以便如何存储它们 - 哪些不是真正。 Oracle中的实际日期存储为代表不同时间单位的整数集。该数值数据通过db默认值或通过to_char()的有意操作转换为可读格式。如果数据存储为varchar,那么请明确说明。 –

+1

然后所有你需要的是** substr(that_column_here,1,8)**除非我错过了什么 –

回答

1

此查询

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

导致错误

ORA-01830:日期格式图象结束转换整个输入串

因为你传递字符串长度22个字符之前,但同时你传递8个字符的日期格式,这显然不符合字符串。你应该写查询作为

select to_timestamp('20150731 00:00:34.550','yyyymmdd hh24:mi:ss.ff3') 
    from dual 

至于你的表,因为你有varchar2列的日期,你必须要对表的内容服务。查询需要执行源字符串和日期格式的匹配。
如果你想显示不受时间只有日期,你不需要处理此字符串作为日期,你可以只

select substr('20150731 00:00:34.550', 1, 8) 
    from dual 
0

是正被存储在Oracle日期时间列之前的日期格式图象结束?否则,您可能需要进行一些操作才能将其变为DD-MON-YYYY格式。如果它以文本字符串形式存储,则可以使用SUBSTR(Date_field, Start_Position, Length)来获取前8个字符。看看这个链接SUBSTR

0

如果列是一个varchar,你需要的日期输出:

select TO_DATE(substr('20150731 00:00:34.550', 1, 8),'YYYYMMDD') from dual 

如果它的日期格式,你需要一个字符串输出:

select to_char(your_column, 'YYYYMMDD') from your_table 
1

什么是列的数据类型?如果它是DATE(因为它应该是),那么它不会以您说的格式存储。它以一种内部二进制格式存储。您将/应该使用to_char函数以您选择的任何格式显示它。如果不使用to_char函数,它将以NLS_DATE_FORMAT指定的格式显示,格式可以在多个位置指定。

至于你的例子,你传递了一个字符串格式的yyyymmd hh:mi:ss.fff',但是你提供了一个只有YYYYMMDD的描述掩码。它不知道如何处理时间分量。除此之外,当你使用SELECT TO_DATE时,oracle还必须执行暗示TO_CHAR将其转换回字符串以进行显示。

另外,您为to_date提供了一个包含秒的小数部分的字符串。 A DATE数据类型仅解析为秒。如果您需要小数秒,则需要使用TIMESTAMP,而不是DATE

0

上,你没有试图改变该列中的值,而只是试图证明它在YYYYMMDD格式的假设工作 -

正如a_horse_with_no_name提到的,你只需要转换它到一个字符串。在这个例子中我用SYSTIMESTAMP作为我的约会:

SELECT TO_CHAR(systimestamp,'YYYYMMDD') FROM DUAL 

结果:

20160121 

这应该给你你想要显示的YYYYMMDD格式。