我有一个名为logs的表,它有一个datetime字段。 我想根据特定的日期格式选择行的日期和计数。
如何使用SQLAlchemy执行此操作?
答案 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;
依此类推。基本上,您设置日期时间字段的格式,然后继续对格式化的值进行分组等。