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