我的postgres DB有一个Price表,我在其中存储了一系列产品的价格数据,对于每个Price对象,我在它创建时存储它(Price.timestamp),每当产品有新价格时,我创建一个新的Price对象,对于旧的Price对象,我在它结束时存储它(Price.end_time),这两个时间都是datetime对象。
现在,我想计算一段时间内有多少价格。我想很简单,所以我做了下面的查询:
trunc_date = db.func.date_trunc('day', Price.timestamp)
query = db.session.query(trunc_date, db.func.count(Price.id))
query = query.order_by(trunc_date.desc())
query = query.group_by(trunc_date)
prices_count = query.all()
这很棒,但只计算每天有多少个价格是新的/创建的。所以我认为我可以做的是过滤,这样我就可以得到trunc_date在价格的开始和结束之间的价格,如下所示:
query = query.filter(Price.timestamp < trunc_date < Price.time_ended)
但是很明显你不允许这样使用trunc_date。谁能帮我写我的查询?
数据示例:
Price.id Price.timestamp Price.time_ended
1 2022-18-09 2022-26-09
2 2022-13-09 2022-20-09
我想得到的查询结果是:
2022-27-09; 0
2022-26-09; 1
2022-25-09; 1
...
2022-20-09; 2
2022-19-09; 2
2022-18-09; 2
2022-17-09; 1
...
2022-12-09; 0
3条答案
按热度按时间ktca8awb1#
你试过分离过滤器内部的条件吗?
ijnw1ujt2#
您可以使用
trunc_date. between(价格.时间戳,价格.时间结束)
gywdnpxw3#
我想通了。
首先,我使用子查询创建了一个日期范围。
然后,我使用子查询作为原始查询的输入,最后我能够过滤子查询中的日期。
现在,query. all()将提供一个漂亮的列表,其中包含date_series中指定的每一天的价格。