我有一个想了解的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()显示,则需要使用datetime类型的字符串。就您而言,“ 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)转换日期时间或DATE的间隔值, 时间戳,带时区的时间戳或带本地时区的时间戳 数据类型转换为VARCHAR2数据类型的值,格式为 日期格式fmt。如果省略fmt,则日期将转换为 VARCHAR2值如下:
DATE值将转换为默认日期格式的值。
TIMESTAMP和TIMESTAMP WITH LOCAL TIME ZONE的值转换为 值以默认时间戳格式显示。
TIMESTAMP WITH TIME ZONE的值会转换为默认值 带时区格式的时间戳。
类似地,函数TO_CHAR()也接受数字。
从Oracle Docs for TO_CHAR (number)报价:
TO_CHAR(number)使用n将n转换为VARCHAR2数据类型的值。 可选数字格式fmt。值n可以是NUMBER类型, BINARY_FLOAT或BINARY_DOUBLE。如果省略fmt,则n被转换 恰好足以保持其有效值的VARCHAR2值 数字。
如上所述,'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'。
此
SELECT TO_CHAR('19/12/2017','DD/MM/YYYY') FROM DUAL;
没有道理。 '19 / 12/2017'是一个字符串,因此没有必要将其转换为另一个字符串(就像您使用的TO_CHAR一样),更不用说格式掩码了。
如果您在此语句中使用TO_DATE,这表示您要使用'dd / mm / yyyy'格式掩码将字符串'19 / 12/2017'转换为日期值,就可以了。
这就是您在邮件的第一部分中所做的。 SYSDATE是一个返回DATE数据类型值的函数,因此您将TO_CHAR应用于它以便以所需格式显示它。在这里查看格式模型:https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm