1

我无法将日期时间字段转换为日期。这是查询:

SELECT TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy')
FROM PROJ

但是当我运行它时,我收到以下错误,“ORA-01843: not a valid month”

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

SELECT TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, 'MM/dd/yyyy'), 'MM/dd/yyyy')
FROM PROJ

但是得到错误的输出,“2005-01-18 00:00:00.0”

4

1 回答 1

5

我认为您对DATE数据类型有点困惑,因为它具有时间组件-Oracle 中没有单独的DATETIME类型。如果您的RECEIVEDDATE字段已经是 a DATE,似乎是这种情况,那么您正在不必要地转换它,但您也在中间进行到字符串的隐式转换。

TO_DATE(PROJ.RECEIVEDDATE, 'MM/dd/yyyy')

真的在做

TO_DATE(TO_CHAR(PROJ.RECEIVEDDATE, <NLS_DATE_FORMAT>), 'MM/dd/yyyy')

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

从您对问题第一部分的表述方式来看,我认为您正在尝试剥离第二个查询正在执行的字段的时间部分 - 因为这次您有一个明确的日期格式模型,所以这是有效的。但是实际上并不需要进行两次转换,您可以使用该TRUNC函数来执行此操作:

SELECT TRUNC(PROJ.RECEIVEDDATE)
FROM PROJ

最后一部分有点令人困惑 - 这不是“错误”,这是您的客户选择格式化DATE值的方式。如果您想以特定格式查看它,只需使用TO_CHAR,然后您甚至不需要TRUNC

SELECT TO_CHAR(PROJ.RECEIVEDDATE, 'mm/dd/yyyy')
FROM PROJ

...但这取决于您在做什么-如果您纯粹将其用于显示,那很好,如果它将在更大的查询中的其他地方使用,则将其保留为DATE.

于 2013-11-04T19:23:05.603 回答