python - SQL - 查找与当前日期匹配的条目

标签 python sql postgresql date sqlalchemy

下表(我们将其命名为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/

相关文章:

Python-验证某个值是否在列中,并用不同列中的值替换

python - matplotlib 箱线图中 'label' 属性有什么用?

python - 如何在表单中多次使用同一字段?

mysql - 如何从 "exists"查询(MYSQL)中取出值?

mysql - 创建列和行 mysql

python - 迭代 XML 文件并从中提取数据

mysql - 根据另一个表的 id 对一个基于结果的组中两个不同表的两列求和

ruby-on-rails - rails 5.1。 : cannot get JSON object from string

database - 这个递归是如何 self 重复的?

sql - Postgres - 理解索引