【发布时间】:2020-11-01 17:48:48
【问题描述】:
我需要为客户挑选过期信用卡的数据。 如您所知,卡的有效期仅使用MM格式的月份和YY格式的年份。在我的数据库中,所有到期日期都以 MMYY 格式存储,因此我使用 TO_DATE(FONDOS.VENCTARJETA, 'MMYY') 获取日期,然后应用一些条件。
这是我的查询:
SELECT
TO_DATE(FONDOS.VENCTARJETA, 'MMYY') AS F_VENCIMIENTO
FROM
POLIZA POLIZA,
DATOS_FONDOSPOL FONDOS
WHERE
POLIZA.IDEPOL = FONDOS.IDEPOL AND
--TO_DATE(FONDOS.VENCTARJETA, 'MMYY') <= SYSDATE AND
POLIZA.CODINTER = TO_NUMBER(:P2_CLAVE)
这将返回 89 行,如下所示:
F_VENCIMIENTO |
-------------------|
|
2023-08-01 00:00:00|
2020-08-01 00:00:00|
2021-11-01 00:00:00|
2020-09-01 00:00:00|
|
2023-02-01 00:00:00|
---- many more ----
根据结果,我们注意到将“MMYY”日期转换为日期类型列时没有错误。
如您所见,我在 where 子句中注释了一个条件,然后如果我取消注释该行,我会得到:
ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0
这不是我收到此错误的唯一行为,但这是我向您展示它如何失败的最简单的行为。
它没有逻辑,我找不到它发生的原因。 请帮忙。 谢谢。
【问题讨论】:
-
F_VENCIMIENTO是什么类型? -
除了您的问题(您已经有两个很好的答案)之外,请考虑该方法中这两个额外的潜在逻辑错误。首先,如果由于某种原因您仍然拥有 1998 年到期的卡(例如),它们的到期日期可能为“1098”。如果您的数据中可能存在这种到期日期,您应该使用
'RR'格式模型而不是'YY'表示年份。另外,一张 0920 到期的卡不会在 2020 年 9 月 1 日到期 - 它会在 2020 年 10 月 1 日到期。您需要在 WHERE 条件下进行为期一个月的调整。使用 ADD_MONTHS 函数。
标签: oracle plsql where-clause to-date sysdate