У меня есть таблица, называемая журналами, которая имеет поле datetime. Я хочу выбрать дату и количество строк на основе определенного формата даты.Группировать по дате в определенном формате в SQLAlchemy
Как это сделать с помощью SQLAlchemy?
У меня есть таблица, называемая журналами, которая имеет поле datetime. Я хочу выбрать дату и количество строк на основе определенного формата даты.Группировать по дате в определенном формате в SQLAlchemy
Как это сделать с помощью 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;
ОК, может быть, вам не нужно 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;
И так далее и так далее. В основном, вы форматируете поле datetime, а затем переходите к группировке и т. Д. В форматированном значении.
Считает ли подсчет таким же результат, когда вы просто группируете неформатированный столбец datetime? Если это так, вы можете просто запустить запрос и впоследствии использовать метод strftime() даты Python. то есть
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 поддерживает вызовы через 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. Если есть независимый от базы данных способ сделать это, я никогда не нашел его. В моем случае я запускаю производство и тестирование aggst Postgres и модульные тесты aginst SQLite и прибегал к использованию определенных пользователем функций SQLite в своих модульных тестах для имитации функций Postat datetime.
Именно то, что мне нужно ... теперь в руководстве SQLite, чтобы найти функцию усечения! Я думаю, что это `` STRFTIME ('% Y-% m', когда) `` в моем случае. – 2012-03-26 14:19:56