python - sqlAlchemy 中的 Raq SQL 似乎格式化年份错误
问题描述
我正在尝试修复一个错误,即我的数据库中的数据没有被正确分组,并且想知道是否有一个简单的修复,因为我不是 SQL 大师。
我们正在尝试围绕特定日期对记录进行分组。问题之所以突出,是因为我们正处于新的一年,而新的一年在这一周结束。发生的情况是其中一个日期而不是 2020 年 12 月 27 日,它必须获得一周最后一天的年份并将其变成 2021 年 12 月 27 日。所有关于我们都希望那时已经是 2021 年的笑话,这是一个奇怪的错误,我不确定如何解决它。
这是我认为包含问题的有问题的 Python 块:
date = sa.literal_column("to_date(concat(extract(year from {}.created_at),extract(week from {}.created_at)), 'yyyyww')".format(metric_class.__table__,metric_class.__table__))
if 'date_group' in request_args:
group_classname = "".join([part.title() for part in request_args['date_group'].split("_")])
group_class = expand_classes[group_classname]
date = sa.literal_column("to_date(concat(extract(year from {}.created_at),extract(week from {}.created_at)), 'yyyyww')".format(group_class.__table__,group_class.__table__))
编辑:添加请求的信息
metric_class 和 group 类:只是对我们众多表类之一的引用。它们都包含一个 id(主键)和一个 created_at(日期)。
在我的环境中生成的示例实际查询:
SELECT to_date(concat(extract(year from users.created_at),extract(week from users.created_at)), 'yyyyww'), count(users.id) AS count_1
FROM users
WHERE users.deleted_at IS NULL AND users.company_id = '762976f4-8e19-4f1a-a0ef-b205fb8f68f2' AND
users.created_at > '1/21/2020' AND users.role = 2 GROUP BY
to_date(concat(extract(year from users.created_at),extract(week from users.created_at)), 'yyyyww') ORDER BY to_date(concat(extract(year from users.created_at),extract(week from users.created_at)), 'yyyyww') DESC LIMIT 50;
我无法向您展示实际的错误数据,因为它位于我无法访问的生产环境中,但这里是您可能会看到从我的数据中编辑的内容的示例:
to_date | count_1
------------+---------
2021-12-28 | 1
2020-12-16 | 2
2020-12-02 | 1
2020-11-25 | 12
2020-11-18 | 3
2020-11-04 | 2
2020-05-27 | 2
2020-04-01 | 3
2020-03-25 | 1
2020-03-18 | 1
2020-02-12 | 1
解决方案
经过一些研究和玩弄 rfkortekaas 所说的内容后,我找到了一个简单的解决方法。
我改变了两行:
date = sa.literal_column("to_date(concat(extract(year from {}.created_at),extract(week from {}.created_at)), 'yyyyww')".format(metric_class.__table__,metric_class.__table__))
到:
date = sa.literal_column("date_trunc('week',{}.created_at)".format(metric_class.__table__))
date_trunc 是获得一周开始的方式