下表(我们将其命名为validity_period):
------------------------------- id | valid_from | valid_until ------------------------------- 1 2012-11-12 2012-12-02 2 2012-12-03 NULL 3 2012-12-15 2012-12-21
(valid_from is not nullable; valid_until is nullable, but don't have to be null)
Now I want to find out which entry is valid today (2012-12-19). From the logical sight of view it has to be entry 3, because the entries can overlap each other but only one entry is valid on one day. (On 2012-12-22 it has to be entry 2 which is valid.)
Note that all entries can have a valid_until, but there can't be more than one entry where valid_until is NULL.
How would I perform this in a SQL-Query? (If possible in SQLAlchemy, but I also can translate it myself from raw SQL)
(I'm using PostgreSQL 9.1)
EDIT: Here my final resolution. Thanks to all contributors!
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;
最佳答案
您可以使用 WINDOW 函数(例如滞后或超前)来引用上一条/下一条记录,并限制“打开”间隔:
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE daterange
( id INTEGER NOT NULL
, valid_from DATE NOT NULL
, valid_until DATE
);
INSERT INTO daterange (id, valid_from, valid_until) VALUES
(1, '2012-11-12', '2012-12-02' )
,(2, '2012-12-03', NULL)
,(3, '2012-12-15', '2012-12-21' )
,(4, '2012-12-22', NULL )
;
-- The CTE is for convenience; could be a subquery or view
WITH magic AS (
SELECT dr.id
, dr.valid_from
, COALESCE(dr.valid_until , lead(valid_from) OVER ww) AS valid_until
FROM daterange dr
WINDOW ww AS (ORDER BY dr.valid_from )
)
SELECT *
FROM magic ma
WHERE now() BETWEEN ma.valid_from AND ma.valid_until
;
关于python - SQL - 查找与当前日期匹配的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957732/