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

时间:2008-10-19 16:52:44

标签: python sql sqlalchemy

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

如何使用SQLAlchemy执行此操作?

3 个答案:

答案 0 :(得分:4)

我不知道一般的SQLAlchemy答案。大多数数据库通常通过函数支持某种形式的日期格式。 SQLAlchemy支持通过sqlalchemy.sql.func调用函数。例如,使用SQLAlchemy而不是Postgres后端,以及表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日期时间函数。其他数据库将有所不同。你没有提到underlyig数据库。如果有一种独立于数据库的方式,我从来没有找到过。在我的情况下,我运行生产和测试aginst Postgres和单元测试aginst SQLite并在我的单元测试中使用SQLite用户定义的函数来模拟Postgress日期时间函数。

答案 1 :(得分:1)

当您按未格式化的日期时间列分组时,计数会产生相同的结果吗?如果是这样,您可以运行查询并在之后使用Python date的strftime()方法。即。

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]

答案 2 :(得分:0)

我不知道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;

好的,也许你不需要ORDER BY,也许最好重新指定日期表达式。可能有其他选择,例如:

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;

依此类推。基本上,您设置日期时间字段的格式,然后继续对格式化的值进行分组等。