了解TO_CHAR以在oracle中转换日期

时间:2017-12-19 16:44:50

标签: sql oracle to-char

我有一个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.

3 个答案:

答案 0 :(得分:1)

如上所述,“ 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')将返回'Dec 19,2017'。

答案 1 :(得分:0)

在您的查询中,您使用的是字符串值。相反,如果要使用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(日期时间)转换日期时间或间隔值DATE,   TIMESTAMP,具有时区的TIMESTAMP或具有本地时区的TIMESTAMP   数据类型为指定格式的VARCHAR2数据类型的值   日期格式fmt。如果省略fmt,则将date转换为a   VARCHAR2值如下:

     

DATE值将转换为默认日期格式的值。

     

TIMESTAMP和TIMESTAMP与LOCAL TIME ZONE值转换为   默认时间戳格式的值。

     

TIMESTAMP WITH TIME ZONE值将转换为默认值   带时区格式的时间戳。

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

引用Oracle Docs for TO_CHAR (number)

  

TO_CHAR(数字)将n转换为VARCHAR2数据类型的值,使用   可选的数字格式fmt。值n可以是NUMBER类型,   BINARY_FLOAT,或BINARY_DOUBLE。如果省略fmt,则转换n   VARCHAR2的值足够长以保持其重要性   位数。

答案 2 :(得分:0)

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

没有意义。 &#39 19/12/2017年'是一个字符串,所以没有用它将它转换为另一个字符串(就像你使用TO_CHAR),更不用说格式掩码。

如果您在此声明中使用了TO_DATE,这表示您想要转换字符串' 19/12/2017'使用' dd / mm / yyyy'进入日期值格式掩码。

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