下表(我们将其命名为validity_period):
------------------------------------------- 编号 | 有效来自 | 有效_直到 ------------------------------------------- 1 2012-11-12 2012-12-02 2 2012-12-03 空 3 2012-12-15 2012-12-21
(valid_from 不可为空;valid_until可空,但不必为空)
现在我想找出今天(2012-12-19)哪个条目有效。从逻辑上看,它必须是条目 3,因为条目可以相互重叠,但只有一个条目在一天内有效。(在 2012 年 12 月 22 日,它必须是有效的条目 2。)
请注意,所有条目都可以有一个valid_until ,但valid_until为 NULL 的条目不能超过一个。
我将如何在 SQL 查询中执行此操作?(如果可能在 SQLAlchemy 中,但我也可以自己从原始 SQL 中翻译它)
(我使用的是 PostgreSQL 9.1)
编辑:这是我的最终决议。感谢所有贡献者!
SELECT *
FROM validity_period
WHERE valid_from <= CURRENT_DATE AND
valid_until >= CURRENT_DATE
UNION
SELECT *
FROM validity_period
WHERE valid_from <= CURRENT_DATE AND
valid_until IS NULL
ORDER BY valid_from DESC
LIMIT 1;