了解 TO_CHAR 在 oracle 中转换日期

Understanding TO_CHAR to convert dates in oracle

我有一个 oracle 数据问题,我想了解一下。

下面是我执行的一些查询,评论是输出。

SELECT SYSDATE FROM DUAL; --19-DEC-17 
SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY') FROM DUAL; -- 19/12/2017
SELECT TO_CHAR(SYSDATE,'MM/DD/YYYY') FROM DUAL; -- 12/19/2017

我的问题是 to_char 方法期望什么样的日期格式作为第一个参数?是否有我们需要传递的默认日期格式?

所以我也尝试了下面的查询,但它抛出了一个错误。 如果有专家可以向我解释 to_char 的工作原理,那就太好了。

SELECT TO_CHAR('19/12/2017','DD/MM/YYYY') FROM DUAL;

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

在您的查询中,您使用的是一个字符串值。相反,如果要使用 TO_CHAR() 显示,则需要使用日期时间类型的字符串。在您的情况下, '19/12/2017' 是一个纯字符串。请使用 TO_DATE() 函数将其转换为日期类型。

SELECT TO_CHAR('19/12/2017','DD/MM/YYYY') FROM DUAL;  // error

引自Oracle Docs for TO_CHAR (datetime)

TO_CHAR (datetime) converts a datetime or interval value of DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, or TIMESTAMP WITH LOCAL TIME ZONE datatype to a value of VARCHAR2 datatype in the format specified by the date format fmt. If you omit fmt, then date is converted to a VARCHAR2 value as follows:

DATE values are converted to values in the default date format.

TIMESTAMP and TIMESTAMP WITH LOCAL TIME ZONE values are converted to values in the default timestamp format.

TIMESTAMP WITH TIME ZONE values are converted to values in the default timestamp with time zone format.

同样,函数 TO_CHAR() 也接受数字。

引自Oracle Docs for TO_CHAR (number)

TO_CHAR (number) converts n to a value of VARCHAR2 datatype, using the optional number format fmt. The value n can be of type NUMBER, BINARY_FLOAT, or BINARY_DOUBLE. If you omit fmt, then n is converted to a VARCHAR2 value exactly long enough to hold its significant digits.

这个

SELECT TO_CHAR('19/12/2017','DD/MM/YYYY') FROM DUAL;

没有意义。 '19/12/2017' 是一个字符串,因此将它转换为另一个字符串(如您使用的 TO_CHAR)没有任何用处,更不用说格式掩码了。

如果你在这个语句中使用TO_DATE就可以了,它表示你想将字符串'19/12/2017'转换为日期值,使用'dd/mm/yyyy'格式掩码.

这就是您在邮件第一部分中所做的。 SYSDATE 是 returns DATE 数据类型值的函数,因此您对其应用 TO_CHAR 以便以您想要的格式显示它。在此处查看格式模型:https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm

如上所述,'19/12/2017' 已经是一个字符串,因此您不能将它与 to_char 一起使用。如果你想这样做进行测试,你首先需要使用 to_date('19/12/2017','DD/MM/YYYY') 将 '19/12/2017' 转换为日期格式,然后你可以使用 to_char 转换回字符格式。例如,to_char(to_date('19/12/2017','DD/MM/YYYY'),'Mon DD, YYYY') 将 return 'Dec 19, 2017'.