Группировка по дате в определенном формате в SQLAlchemy - PullRequest
2 голосов
/ 19 октября 2008

У меня есть таблица с именем logs, в которой есть поле даты и времени. Я хочу выбрать дату и количество строк на основе определенного формата даты.

Как мне сделать это с помощью SQLAlchemy?

Ответы [ 3 ]

4 голосов
/ 20 октября 2008

Я не знаю общего ответа на 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. Если есть независимый от базы данных способ сделать это, я никогда не нашел его. В моем случае я запускаю производственные и тестовые тесты в Postgres и модульные тесты в SQLite и прибегаю к использованию пользовательских функций SQLite в моих модульных тестах для эмуляции функций даты и времени Postgress.

1 голос
/ 19 октября 2008

Дает ли подсчет тот же результат, когда вы просто группируете по неформатированному столбцу даты-времени? Если это так, вы можете просто выполнить запрос и впоследствии использовать метод strftime () Python date. т.е.

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]
0 голосов
/ 19 октября 2008

Я не знаю 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;

И так далее, и тому подобное. Обычно вы форматируете поле даты и времени, а затем приступаете к группировке и т. Д. Для отформатированного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...