Python 在SQLAlchemy中以特定格式按日期分组

Python 在SQLAlchemy中以特定格式按日期分组,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我有一个名为logs的表,它有一个datetime字段。 我想根据特定的日期格式选择日期和行数 我如何使用SQLAlchemy做到这一点?我不知道SQLAlchemy,所以我可能会偏离目标。然而,我认为你所需要的是: SELECT date_formatter(datetime_field, "format-specification") AS dt_field, COUNT(*) FROM logs GROUP BY date_formatter(datetime_field,

我有一个名为logs的表,它有一个datetime字段。 我想根据特定的日期格式选择日期和行数


我如何使用SQLAlchemy做到这一点?

我不知道SQLAlchemy,所以我可能会偏离目标。然而,我认为你所需要的是:

SELECT date_formatter(datetime_field, "format-specification") AS dt_field, COUNT(*)
    FROM logs
    GROUP BY date_formatter(datetime_field, "format-specification")
    ORDER BY 1;
好的,也许您不需要orderby,也许最好重新指定日期表达式。可能有替代方案,例如:

SELECT dt_field, COUNT(*)
    FROM (SELECT date_formatter(datetime_field, "format-specification") AS dt_field
              FROM logs) AS necessary
    GROUP BY dt_field
    ORDER BY dt_field;

等等等等。基本上,您可以格式化datetime字段,然后对格式化的值进行分组等操作。

当您仅按未格式化的datetime列进行分组时,计数是否会产生相同的结果?如果是这样,您可以运行查询,然后使用Python date的strftime()方法。i、 e

query = select([logs.c.datetime, func.count(logs.c.datetime)]).group_by(logs.c.datetime)
results = session.execute(query).fetchall()
results = [(t[0].strftime("..."), t[1]) for t in results]

我不知道一个通用的炼金术答案。大多数数据库支持某种形式的日期格式,通常通过函数。SQLAlchemy支持通过SQLAlchemy.sql.func调用函数。例如,在Postgres后端使用SQLAlchemy和一个表my_table(foo varchar(30),时间戳时),我可能会执行以下操作

my_table = metadata.tables['my_table']
foo = my_table.c['foo']
the_date = func.date_trunc('month', my_table.c['when'])
stmt = select(foo, the_date).group_by(the_date)
engine.execute(stmt)

按截断为月份的日期分组。但请记住,在该示例中,date_trunc()是一个Postgres datetime函数。其他数据库将有所不同。你没有提到Underlyg数据库。如果有一种独立于数据库的方法,我从未找到过。在我的例子中,我运行生产和测试aginst Postgres和单元测试aginst SQLite,并在单元测试中使用SQLite用户定义函数来模拟Postgress datetime函数

正是我需要的。。现在转到SQLite手册来查找truncate函数!在我的例子中,我认为是
STRFTIME(“%Y-%m',when)