我想将给定的时间戳记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:日期格式图片在转换整个输入之前结束 字符串
答案 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>