【问题标题】:Comparison between dates in SQL using to_timestamp使用 to_timestamp 比较 SQL 中的日期
【发布时间】:2014-11-20 10:01:28
【问题描述】:

必须比较两个日期,一个格式为 MM/DD/YYYY,另一个格式为 YYYY/MM/DD HH:MI:SS。

如何做到这一点。我尝试使用 to_timestamp 但它抛出了一个错误,例如:

  AND TO_TIMESTAMP(PAYMENT_DATE,'MM/DD/YYYY HH:MI:SS')>=TO_TIMESTAMP( :L_RESEND_DATE,'YYYY/MM/DD HH:MI:SS')

[错误] 执行 (23:27): ORA-01843: not a valid month

【问题讨论】:

  • 您是否考虑过使用DATETIME 数据类型来存储您的日期?
  • 各个列/参数的数据类型是什么? datetimestamp 都没有格式。只有代表日期的VARCHAR2 具有格式。但在VARCHAR2 列中存储日期或时间戳数据几乎总是错误的。
  • 如果payment_datetimestampdate 列,使用to_timestamp 完全没用,很可能会导致此错误。
  • @GarethD:您正在链接到 MySQL 手册,但 user3809240 使用的是 Oracle(没有 datetime 数据类型)。
  • @a_horse_with_no_name 我很糟糕,我看到网页是 `docs.oracle.com" 并且没有费心阅读上面的内容。我没有意识到 Oracle 网站上有 MySQL 文档它....我的观点仍然有效,尽管我可能应该说“你考虑过使用TIMESTAMP 来存储你的日期吗?”

标签: sql oracle date


【解决方案1】:

由于payment_date 已经是date 类型,您不需要也不应该转换它。您正在根据您的 NLS 设置进行从 datevarchar2 的隐式转换,然后使用您指定的格式模型进行显式转换,正如 a_horse_with_no_name 所说,这既没有意义又容易出错。所以你实际上是在做:

TO_TIMESTAMP(TO_CHAR(PAYMENT_DATE, <NLS_DATE_FORMAT>),'MM/DD/YYYY HH:MI:SS')

例如,如果您会话的 NLS_DATE_FORMAT 是 DD/MM/YYYY,这意味着您正在做:

TO_TIMESTAMP(TO_CHAR(PAYMENT_DATE, 'DD/MM/YYYY'),'MM/DD/YYYY HH:MI:SS')

...并尝试交换月份和日期,这可以解释您的错误。一旦你有一个大于 12 的天数,双重转换就会出错,即使没有抛出错误,其他值也会不正确。

根本不转换你的表格列,只转换参数:

AND PAYMENT_DATE >= TO_DATE(:L_RESEND_DATE, 'YYYY/MM/DD HH24:MI:SS')

我使用了to_date() 而不是to_timestamp(),因为它最终匹配列的数据类型(并允许使用该列上的任何索引),并且您不需要时间戳允许的小数秒精度;我也将HH 更改为HH24,因为您没有 AM/PM 指示器。


现在将datedate 进行比较。它在这里不相关,因为您不需要额外的精度,但是如果您确实想要将 date 转换为 timestamp,则不需要中间的 varchar2 值,您可以cast the value 而不是 CAST(PAYMENT_DATE AS TIMESTAMP)

【讨论】:

  • 绝对是这个......我什至没有考虑到该列可能已经是一个日期。和 HH24 一起取得好成绩!
【解决方案2】:

以下工作完美:

SELECT 1 FROM DUAL
 WHERE TO_TIMESTAMP('11/23/2014 10:32:15','MM/DD/YYYY HH:MI:SS')
       >=
       TO_TIMESTAMP( '2013/11/29 12:54:12','YYYY/MM/DD HH:MI:SS');

所以解决方案很简单 - 很可能您的数据有误...很可能您的某些日期是 DD/MM/YYYY 或 YYYY/DD/MM - 如果有疑问,请相信错误消息,这是非常准确的并且清楚 - 你有一个超出范围的月份值;-)

也许尝试SELECT * FROM ... WHERE TO_NUMBER(SUBSTR(PAYMENT_DATE,1,2)) &gt; 12; 或以其他方式对您的绑定变量执行类似的操作以查找错误的日期...

哦,始终将日期存储为日期或 ISO 格式XKCD

【讨论】:

  • 由于 OP 没有提到他的一个值实际上是一个日期,请参考 Alex Poole 的答案,只是为有类似问题的人保留这个
猜你喜欢
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多