SQL根据日期范围检索另一个表中缺少记录的记录列表

标签 sql postgresql

在没有运气的情况下到处搜索找到一个有效的 SQL,它允许我根据不在给定日期范围内的日期在另一个表中查找丢失的记录。

表:订阅

+------------+
| id | label |
+------------+
| 1  | aaa   |
+------------+
| 2  | bbb   |
+------------+
| 3  | ccc   |
+------------+
| 4  | ddd   |
+------------+

表:subscription_periods

+------------------------------------------------+
| id | subscription_id | start_at   | end_at     |
+------------------------------------------------+
| 1  | 1               | 2015-12-01 | 2016-01-01 |
+------------------------------------------------+
| 2  | 1               | 2016-01-01 | 2016-02-01 |
+------------------------------------------------+ 
| 3  | 2               | 2015-12-01 | 2016-01-01 |
+------------------------------------------------+
| 4  | 3               | 2016-02-01 | 2016-03-01 |
+------------------------------------------------+

目标:比如说,今天是 2016-01-15,我想找到缺少 subscription_periods 记录的 subscriptions 记录没有根据给定日期范围(subscription_periods.start_atsubscription_periods.end_at)涵盖今天。

根据上述数据,subscriptions.id #2、#3 和 #4 没有涵盖 2016-01-15 的 subscription_periods 记录 基于给定的日期范围,因此预期结果如下所示:

+------------+
| id | label |
+------------+
| 2  | bbb   |
+------------+
| 3  | ccc   |
+------------+
| 4  | ddd   |
+------------+

非常感谢任何提示,也非常感谢遇到此问题的任何人。

最佳答案

此查询将返回特定日期的 subscription_periods 中缺少的订阅

SELECT DISTINCT S.id, S.label
FROM subscriptions AS S
    LEFT JOIN subscription_periods AS SP 
    ON S.id = SP.subscriptions_id AND @yourDateHere BETWEEN start_at AND end_at
WHERE SP.id IS NULL

关于SQL根据日期范围检索另一个表中缺少记录的记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34683719/

相关文章:

mysql - 查找连续索引,直到某些字段发生变化

postgresql - 新的 Heroku pg :backups public-url provide? 是什么类型的文件

sql - 在 SQL Server 中查找当前年份日期给定的上一年的同一天

MySQL 查询用于更改表方向(垂直到水平)

javascript - 为什么Koa ctx.body在if语句中不起作用?

python - 1.5 中的 Django 日期时间查询集

ruby-on-rails - rake 中止!没有要加载的文件——pg(在 rails 中创建 postgre 数据库)

postgresql - 防止更新生成的主键列

sql - 使用 SELECT UNION 并从一张表中返回两列的输出

sql - 在 Oracle 中连接和分组多行