【问题标题】:Oracle compare two different datesOracle比较两个不同的日期
【发布时间】:2014-07-16 07:07:08
【问题描述】:

以下查询无法从 java 执行。这里我使用oracle xe服务器

datetrx <= to_date('2014-07-16 00:00:00.0','yyyy/mm/dd hh24:mi:ss.f')

datetrx的日期格式为dd/mm/yyyy

【问题讨论】:

  • "datetrx 的日期格式为 dd/mm/yyyy" - 不,不是。 date没有格式。并且“无法从 java 执行”不是可接受的问题描述。
  • 这里的数据类型 datetrx 是 oracle xe 中的日期。并且包含一些数据,例如 2014 年 7 月 10 日
  • 我只是想在 oracle 中将 '7/10/2014' 与 '2014-07-16 00:00:00.0' 进行比较。这里的第一个(2014 年 7 月 10 日)来自列。

标签: sql oracle


【解决方案1】:

to_date() 函数中的输入字符串与您的模式不匹配。该值包含- 作为分隔符,但是在您使用/ 的模式中:

如果您将输入格式和模式对齐,这应该可以工作:

datetrx <= to_date('2014-07-16 00:00:00','yyyy-mm-dd hh24:mi:ss')

我个人更喜欢 ANSI 时间戳文字而不是 to_date() 函数,因为它们是可移植的并且输入更少:

datetrx <= timestamp '2014-07-16 00:00:00'

注意此处提供的字符串格式始终为 ISO 格式。


附注:
您在查看daterx 列中的值时看到的任何“格式”都由您用来显示该数据的 SQL 客户端(SQL*Plus、SQL Developer 等)应用。

值本身无格式存储在服务器上。 DATE 值的格式化总是由 SQL 客户端(或您的应用程序)完成:

【讨论】:

  • 我很确定你已经知道了,你不能在to_date 中使用小数秒,所以你要么放弃.0.f;如果无法修改字符串,则使用 to_timestamp 代替。但即便如此,它也必须是.ff。 (尽管/- 相比,这是相当宽容的;最好还是把它做好)。
  • @AlexPoole:你是对的。我只是不假思索地复制和粘贴。谢谢,已更正。
【解决方案2】:

请说明您的要求,很难弄清楚您想要什么... 首先,这不是经过验证的日期格式

只需键入并使用 DUAL 试试:

SELECT  to_date('2014-07-16 00:00:00.0', 'YYYY/MM/DD HH24:MI:SS.F') 
FROM dual;

从中删除“.F”部分

【讨论】:

  • 对不起它的付出。 * java.sql.SQLDataException: ORA-01821: 日期格式无法识别
  • 我只是想在 oracle 中将 '7/10/2014' 与 '2014-07-16 00:00:00.0' 进行比较。这里的第一个(2014 年 7 月 10 日)来自列。
  • 是的,我明白了,正如我之前提到的,您需要修复您的日期模式,因为在 Oracle 中不存在像“.f”这样的模式。这不是因为分隔符,例如'/' 或 '-',无关紧要 -> 请参阅:select CASE WHEN to_date('2014-07-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS') >= to_date(' 2014/07/16', 'YYYY/MM/DD') THEN 1 ELSE 0 END FROM dual;
  • 错误 ORA-01821: 日期格式无法识别,因为 oracle 中没有像 'YYYY/MM/DD HH24:MI:SS.F' 这样的模式,好吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多