postgresql 计算一段时间内两个日期之间的项

ulydmbyx  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(3)|浏览(138)

我的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
ktca8awb

ktca8awb1#

你试过分离过滤器内部的条件吗?

query = db.session.\
    query(trunc_date, db.func.count(Price.id)).\
    filter(
        (Price.timestamp < trunc_date),
        (trunc_date < Price.time_ended)
        ).\
    group_by(trunc_date).\
    order_by(trunc_date.desc()).\
    all()
ijnw1ujt

ijnw1ujt2#

您可以使用
trunc_date. between(价格.时间戳,价格.时间结束)

gywdnpxw

gywdnpxw3#

我想通了。
首先,我使用子查询创建了一个日期范围。

todays_date = datetime.today() - timedelta(days = 1)
numdays = 360
min_date = todays_date - timedelta(days = numdays)

date_series = db.func.generate_series(min_date , todays_date, timedelta(days=1))
trunc_date = db.func.date_trunc('days', date_series)
subquery = db.session.query(trunc_date.label('day')).subquery()

然后,我使用子查询作为原始查询的输入,最后我能够过滤子查询中的日期。

query = db.session.query(subquery.c.day, db.func.count(Price.id))
query = query.order_by(subquery.c.day.desc())
query = query.group_by(subquery.c.day)
query = query.filter(Price.timestamp < subquery.c.day)
query = query.filter(Price.time_ended > subquery.c.day)

现在,query. all()将提供一个漂亮的列表,其中包含date_series中指定的每一天的价格。

相关问题