sql - 如何将 PostgreSQL 中的日期四舍五入到上个月或下个月的结束日期?
问题描述
我有一个名为“raw_date”的日期类型列。我需要从中派生另一个日期列,其逻辑是-
1) 如果“raw_date”中的日期介于 1 到 14 之间,则派生日期应该是前一个月的最后一个日期(因此,如果前一个月在 (1,3,5,7,8,10,12) 中,最后一个日期将是31 ; 如果前一个月在 (4,6,9,11) 最后日期将是 30 ;如果前一个月在 (2) 并且年份是闰年,最后日期将是 29,如果它是非闰年,那么它将是 28
2)另外,我需要考虑年份的变化。假设,如果 "raw_date" = '2020-01-12' ,派生日期将是 '2019-12-31'
我正在尝试使用“case”语句并提供明确的上个月日期,但有很多场景,因此无法涵盖逻辑所需的所有场景。如果日期在 1 月的 1 到 14 之间,是否有涵盖所有情况的代码,包括闰年和年份变化。
解决方案
您可以使用case
表达式:
(case when extract(day from raw_date) <= 14
then date_trunc('month', raw_date) - interval '1 day'
else date_trunc('month', raw_date) + interval '1 month' - interval '1 day'
end)
这是一个 db<>fiddle。
推荐阅读
- node.js - 获取数据后的 apollo graphql 服务器隐私控制
- python - multiprocessing.Process 导致:OSError:[Errno 12] 即使我只运行 1 个进程也无法分配内存
- java - 我真的需要在 Spring 中创建接口吗?
- bash - 检查命令的标准输出,如果等于值,则停止循环
- regex - 正则表达式挑战
- windows - 如何在 Windows 中自动启动 XAMPP 和 Laravel 项目
- python - 在 Raspberry PI 中使用 Tkinter 或 guizero 将视频源(OpenCV + picamera)输出到 GUI?
- php - 二维数组元素的 PHP 反序列化无法按预期工作
- regex - 在 htaccess 身份验证中排除主页 URL
- python - 如何删除 NaN 列?