首页 > 解决方案 > 通过比较日期 SQL 过滤数据

问题描述

我有以下数据的表格:

Order_ID 状态更新 状态日期
一个 已收到 2020 年 1 月 1 日
一个 待办的 2020 年 1 月 5 日
一个 加工 2020 年 1 月 7 日
一个 发表 2020 年 1 月 15 日
已收到 2020 年 2 月 1 日
C 已收到 2020 年 2 月 15 日
C 发表 2020 年 2 月 20 日
D 已收到 2020 年 5 月 1 日
D 发表 2020 年 5 月 10 日

现在,我想获取 2020 年 1 月 15 日至 2020 年 4 月 25 日之间的完整订单历史记录,最后状态更新已交付。

结果看起来像:

Order_ID 状态更新 状态日期
一个 已收到 2020 年 1 月 1 日
一个 待办的 2020 年 1 月 5 日
一个 加工 2020 年 1 月 7 日
一个 发表 2020 年 1 月 15 日
C 已收到 2020 年 2 月 15 日
C 发表 2020 年 2 月 20 日

如何编写 SQL 查询来获得此结果?

标签: sqlpostgresql

解决方案


假设您想要 2020 年 1 月 1 日到 2020 年 4 月 25 日之间交付的所有订单的历史记录:

SELECT *
FROM   orders o
WHERE  EXISTS (
   SELECT FROM orders o1
   WHERE  o1.order_id = o.order_id
   AND    o1.status_update = 'Delivered'
   AND    o1.status_date BETWEEN '2020-01-15' AND '2020-04-25'
   )
ORDER  BY order_id, status_date

这包括 2020-01-15 之前的行,只要交货日期在时间范围内。在外部添加另一个谓词以SELECT截断 2020-01-01(或任何日期)之前的行:

AND    o.status_date >= '2020-01-15'

db<>在这里摆弄

另外:始终使用明确的 ISO 格式作为日期。


推荐阅读