Postgresql 带当前日期的查询条件订单

Postgresql 带当前日期的查询条件订单,postgresql,date,Postgresql,Date,我在Postgresql数据库表中有以下列的产品: standard_price -- Price of product promo_price -- Price of product in sale promo_date_from -- Sale is valid from promo_date_to -- Sale is valid to 任务是按当前价格订购产品。当前价格是促销价格,当今天在促销日期和促销日期之间时;否则,当前价格为标准价格 一种可能的解决方案如下:

我在Postgresql数据库表中有以下列的产品:

standard_price   -- Price of product
promo_price      -- Price of product in sale
promo_date_from  -- Sale is valid from
promo_date_to    -- Sale is valid to
任务是按当前价格订购产品。当前价格是促销价格,当今天在促销日期和促销日期之间时;否则,当前价格为标准价格

一种可能的解决方案如下:

SELECT * FROM products 
ORDER BY 
    CASE WHEN promo_date_from <= '2020-02-24'::date AND '2020-02-24'::date <= promo_date_to THEN
        promo_price 
    ELSE 
        standard_price 
    END;
从产品中选择*
订购人
促销日期从何时开始的案例
日期默认为当前日期,也可以将值日期作为参数:

select * from prices() order by price;
select * from prices('2020-02-02') order by price;

在日期字段上创建索引对此查询没有帮助。对于每个记录,必须在两个价格之间做出决定。我试过你的版本,对我来说很快。我甚至尝试将查询分成两部分,第一部分来自“THEN”,第二部分来自“ELSE”,然后将它们与UNIONALL组合,最后将它们用作子查询。在这种情况下,理论上可以使用索引,但实际上优化器决定不使用它们。这是因为使用索引也是一项工作,只有当它帮助您避免阅读很多行时才值得使用它;DBMS执行此操作的最快方法是全表扫描。索引没有帮助。如果你经常需要当前的价格,那么你可以考虑每天早晨运行一个脚本来评估每一个产品的当前价格并将其存储在一个附加的列中。(这当然是多余的,但有时我们需要这样的措施。)另一种方法可能是通过
set max_parallel_workers
:)进行并行处理。是的,你是对的。作为备份解决方案,我正在考虑每日脚本,它应该非常快(一个更新查询)。用于优化的冗余列是可以的。唯一的缺点是(如我所知),它必须在Postgresql之外实现。我更喜欢“仅Postgresql解决方案”,但正如我所说的,这是一个很好的选择。感谢您的回答,您的解决方案在使用上似乎更漂亮(选择查询更简单)。从速度的角度来看,它似乎比直接在order查询中编写case语句的解决方案要慢一些?他们中有多少人参加了约会?还有更多的字段和WHERE子句吗?看看解释分析,问题点是什么?如果我想生成一些测试数据并进行速度测试…我试图将我的问题简化到问题的核心,数据库结构更复杂。包含价格和附加数据的表(大约有20万条记录。Where子句可能更复杂(必须发布产品(需要连接以检查产品是否已发布),来自给定类别及其子类别)加上分页的限制+偏移量。目前,日期检查约占记录的1%,但将来可能会增加(这取决于我们系统的管理员)。解释说,最高的成本是在排序,其他一切工作完美。我需要排序,以实现“按价格排序产品”过滤器。
select * from prices() order by price;
select * from prices('2020-02-02') order by price;