我正在尝试编写一个 case 表达式,它查看截止日期,如果它已经过去,则选择即将到来的或最接近的截止日期。现在由于某些数据库限制,我必须手动执行此操作。问题是我的代码正在比较从due_date提取的日期(a)和从当前time_stamp提取的日期(b) ,如果a < b表示当前月份的到期日已经过去,下一个将是(a /当前月份+ 1) <- 日期格式示例 a / Oct.
现在的问题是,如果当前月份是 12(12 月),这将使下一个到期日成为我不想要的 / 13 。有什么方法可以将其限制为 12 并重置为 1?
另外,如果你能帮助我一年的部分,加分?
due_date |current_timestamp | Result
----------- ----------------- -----------
2021-12-05 |2022-10-18 | 2022-11-05
2022-06-02 |2022-10-18 | 2022-11-02
2022-10-19 |2022-10-18 | 2022-10-19
2022-10-15 |2022-10-18 | 2022-11-15
2021-10-20 |2022-10-18 | 2022-10-20
CASE
WHEN EXTRACT(DAY FROM due_date ) < EXTRACT(DAY FROM CURRENT_TIMESTAMP) THEN CONCAT(EXTRACT(DAY FROM due_date ),'/',(EXTRACT(Month FROM CURRENT_TIMESTAMP))+1)
ELSE CONCAT(EXTRACT(DAY FROM due_date ),'/',(EXTRACT(Month FROM CURRENT_TIMESTAMP)))
END AS "Next Payment Date"
作为一般规则,最好尽可能使用日历函数,而不是单独计算年月日部分。
您没有提到到期日的日期是否可以是31/30/29,那么当当月没有这样的一天时应该是什么结果。一些计费系统通过从不使用此类日期来解决该问题(通常,他们将日期推迟到下个月的 1 日)。让我们假设这是你的情况。
您需要计算的两个日期是:
有了这些,您只需根据具体情况选择日期之一:
结果:
记住大多数数据库都有处理日期加法/减法/比较的工具是有帮助的。对于 Postgres,您可以在此处找到它们:https ://www.postgresql.org/docs/current/functions-datetime.html
我认为年份边界不会让您头疼 - 月份可以有不同的天数,我们不能只是将月份的值增加 1 并仍然收到有效日期。为了解决这个限制,我们
INTERVAL
在 Postgres(以及其他一些 SQL 变体)中使用:从我能够理解的内容中,这应该可以为您提供您想要的东西。如果需要修改,请告诉我:
最后一个条件有效,因为“短”月份(2 月、4 月、6 月、9 月、11 月)总是在 31 天的月份之前/之后。
在此处查看小提琴:https ://www.db-fiddle.com/f/4jyoMCicNSZpjMt4jFYoz5/6061