Oracle TIMEDATE 到 DATE

Posted

技术标签:

【中文标题】Oracle TIMEDATE 到 DATE【英文标题】:Oracle TIMEDATE to DATE 【发布时间】:2013-11-04 19:10:06 【问题描述】:

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

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”

【问题讨论】:

如果你只运行 to_char 函数你会看到什么? 当我做 to_char 时格式是正确的,但它不是日期,所以它只按数字顺序排序。 如果这是在 Eclipse 中,那么您正在使用 JDBC。已经有一段时间了,但SELECT RECEIVEDDATE FROM PROJ 不会返回 java.sql.Date 对象吗? 【参考方案1】:

我认为您对DATE 数据类型有点困惑,因为它具有时间组件——Oracle 中没有单独的DATETIME 类型。如果您的RECEIVEDDATE 字段已经是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 function 来执行此操作:

SELECT TRUNC(PROJ.RECEIVEDDATE)
FROM PROJ

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

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

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

【讨论】:

RECEIVEDDATE 的数据返回为 2005-01-18 22:35:31.0,我希望它为 MM/dd/yyyy,但从我尝试的所有内容来看,没有任何效果 @user2953762 - 您的客户端似乎正在这样格式化您可以尝试更改您的客户端设置,但最好使用TO_CHAR 指定您想要的格式。但是你暗示你想通过它订购,在这种情况下你应该把它保留为DATEORDER BY 条款的租约。

以上是关于Oracle TIMEDATE 到 DATE的主要内容,如果未能解决你的问题,请参考以下文章

怎样实现每天自动执行oracle的存储过程一次

怎样实现每天自动执行oracle的存储过程一次?

有没有更好的方法来编写这个处理比较两个不同列中的日期的 Oracle SQL?

oracle创建定时任务

Oracle存储过程记录异常

Oracle定时调用存储过程