在Oracle 12c中将时间戳转换为日期

时间:2018-12-20 13:38:47

标签: sql oracle oracle12c

我想将给定的时间戳记2019-04-08 00:00:00.0转换为日期,格式为2019-04-08

我已经尝试使用:

SELECT TO_DATE('2019-04-20 00:00:00.0','YYYY-MM-DD') from dual; 

但是我得到提示:

  

ORA-01830:日期格式图片在转换整个输入之前结束   字符串

3 个答案:

答案 0 :(得分:3)

我认为您可能对TO_DATE函数的工作原理以及DBMS如何处理日期有一些概念上的误解。

YYY-MM-DD与您要导入的实际字符串(2019-04-20 00:00:00.0)的格式不匹配,这就是错误告诉您的内容。您必须告诉TO_DATE函数您在输入中输入的日期字符串中期望什么。您可以通过格式字符串来实现。如果您未指定与实际要提供的格式匹配的格式字符串,则该函数将无法处理该字符串。

接下来,您说您想将其“转换为这种格式的日期” ...但是,这并不完全有意义。 TO_DATE将字符串转换为DATETIME类型的变量-即日期对象。日期对象不存在任何特定格式,而是作为对象存在。在内部,它将以独立于任何人类可读日期格式的方式存储日期信息。格式完全与日期的表示有关,当视为 string 时。有了日期对象后,如果您希望人类能够以他们的文化所熟悉的样式阅读日期,则可以以特定格式输出

因此,首先要正确地将日期字符串作为日期对象导入,可以使用准确的格式字符串,也可以使用TO_TIMESTAMP代替TO_DATE,以便捕获亚秒值:

SELECT TO_TIMESTAMP('2019-04-20 00:00:00.0','YYYY-MM-DD HH24:MI:SS.FF5') from dual; 

如果您在控制台中运行此命令,那么SELECT将自动将日期对象(TO_DATE函数的结果)重新格式化为服务器/会话中配置的默认日期格式。

但是,如果您实际上希望以特定格式在屏幕上看到它,则可以明确地说出-一种明智的方式是使用TO_CHAR函数:

SELECT TO_CHAR(TO_TIMESTAMPT('2019-04-20 00:00:00.0','YYYY-MM-DD HH24:MI:SS.FF5'), 'YYYY-MM-DD') from dual;

格式说明符的完整列表可以在here(以及在线的其他地方)中找到。

以上内容的实时演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=619d918ea73953e11b3150c6b560112c

答案 1 :(得分:0)

假设输入的是实际文本,而不是真实的时间戳,则可以在调用TO_DATE之前尝试截断文本:

WITH cte AS (
    SELECT '2019-04-20 00:00:00.0' AS ts FROM dual
)

SELECT TO_DATE(SUBSTR(ts, 1, 10), 'YYYY-MM-DD')
FROM cte;

如果您输入的是实际的Oracle时间戳,并且要将其转换为日期,则可以使用CAST

SELECT CAST(ts AS DATE) dt
FROM cte;

答案 2 :(得分:0)

投射有什么好处吗?

我正在设置日期格式,以使其显示 time 组件,尽管它是00:00:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

SQL> select cast(timestamp '2019-04-20 00:00:00.0' as date) result from dual;

RESULT
-------------------
20.04.2019 00:00:00

另一种格式(没有时间成分):

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select cast(timestamp '2019-04-20 00:00:00.0' as date) result from dual;

RESULT
----------
20.04.2019

SQL>

或者,使用TO_CHAR函数(因此会话的日期格式无关紧要):

SQL> select to_char(timestamp '2019-04-20 00:00:00.0', 'dd.mm.yyyy') result from dual;

RESULT
----------
20.04.2019

SQL>