Oracle TIMEDATE到DATE

1 sql eclipse oracle to-char to-date

我将日期时间字段转换为日期时遇到问题.这是查询:

SELECT TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy')
FROM PROJ
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我收到以下错误,"ORA-01843:不是有效月份"

所以我尝试先转换为char,然后再转换为char

SELECT TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, 'MM/dd/yyyy'), 'MM/dd/yyyy')
FROM PROJ
Run Code Online (Sandbox Code Playgroud)

但输出错误,"2005-01-18 00:00:00.0"

Ale*_*ole 5

我认为你对DATE数据类型有点困惑,因为它有一个时间组件 - DATETIME在Oracle中没有单独的类型.如果您的RECEIVEDDATE字段已经是a DATE,就像是这样,那么您将不必要地转换它,但您也在中间进行隐式转换为字符串.

TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy')
Run Code Online (Sandbox Code Playgroud)

真的在做

TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, <NLS_DATE_FORMAT>), 'MM/dd/yyyy')
Run Code Online (Sandbox Code Playgroud)

...并且ORA-08143错误表明您可能是NLS格式DD/MM/YYYY.当日期的某一部分大于12时,您可能会遇到这种错误,因为没有月份的数字大于12.看起来您正在使用2005-01-18,所以它正在尝试将18解释为一个月,因此错误是合理的.

从你如何处理问题的第一部分开始,我认为你试图剥离第二个查询正在进行的字段的时间部分 - 这是有效的,因为这次你有一个明确的日期格式模型.但是,进行两次转换并不是必需的,您可以使用该TRUNC函数来执行此操作:

SELECT TRUNC(PROJ.RECEIVEDDATE)
FROM PROJ
Run Code Online (Sandbox Code Playgroud)

最后一部分有点令人困惑 - 这不是'错',而是客户选择格式化DATE价值的方式.如果你想以特定的格式看到它,只需使用TO_CHAR,然后你甚至不需要TRUNC:

SELECT TO_CHAR(PROJ.RECEIVEDDATE, 'mm/dd/yyyy')
FROM PROJ
Run Code Online (Sandbox Code Playgroud)

...但这取决于你正在做什么 - 如果你纯粹用于显示它是好的,如果它将在更大的查询中的其他地方使用然后留下它作为DATE.