Запрос на один день относительно часового пояса - PullRequest
0 голосов
/ 05 июля 2019

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

Яконечно, я слишком усложняю эту проблему, но я довольно плохо знаком с Python и SQLAlchemy, не говоря уже о датах, времени и часовых поясах.

Я храню свои метки времени в UTC, используя столбец с default = utcnow ()... это прекрасно работает: 2019-07-05 06: 19: 59.920630

Я даже могу отображать временные метки в текущем часовом поясе браузера по мере необходимости (в других частях приложения).

Однако я пытаюсь выполнить запрос SQLAlchemy на основе часового пояса, чтобы просто получить записи для локального дня этого пользователя.

2019-07-05 06:19: 59.920630 можно преобразовать с помощью моей вспомогательной функции utc_to_local в 2019-07-04 23: 19: 59.920630 ... поэтому мне нужно, чтобы мой запрос включал эту запись даты и времени в мой запрос для всех записей "4 июля 2019 года"

Итак, я выполнял запрос SQLAlchemy, чтобы получить список различных дат

>>>uniquedays=db.session.query(func.distinct(func.DATE(TableClass.timestamp))).all()

, но я только что понял, что это возвращает список дат, которые потенциально не имеют никаких записей для языкового стандарта пользователя... в моем примере 5 июля нет записей для моего часового пояса, но он возвращается в качестве уникального.

Так что я также могу вернуть список datetime, например:

>>>datetimelist = db.session.query(TableClass.timestamp).all()

Но теперь я только что получил список кортежей datetime (я полагаю):

>>>datetime
[(datetime.datetime(2019, 6, 30, 21, 8, 11, 354018),), (datetime.datetime(2019, 6, 30, 21, 21, 58, 158467),), (datetime.datetime(2019, 6, 30, 23, 39, 8, 310248),)....................

Я использовал это для преобразования utc datetime в мое местное время:

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

Я сейчас использую SQLite, но намереваюсь перейти наБаза данных MySQL для производства.

1 Ответ

0 голосов
/ 06 июля 2019

В идеале это будет сделано на уровне БД.В MySQL это может выглядеть примерно так:

user_tz = 'PST'
uniquedays = db.session.query(func.distinct(func.DATE(
                 func.convert_tz(TableClass.timestamp, 'UTC', user_tz)))).all()

К сожалению, однако, SQLite не поддерживает полностью гибкое преобразование часового пояса.Поэтому, пока вы не переключитесь, вам придется делать это на Python.Надеюсь, у вас нет миллионов строк?

import arrow
from collections import Counter

datetimelist = db.session.query(TableClass.timestamp).all()
dates = [arrow.get(dt[0]).to('US/Pacific').date() for dt in datetimelist]
counter = Counter(dates)

Другой подход - использовать гибридные свойства SQLAlchemy , но, вероятно, не стоит беспокоиться, если вы собираетесь переключатьсяв любом случае, к настоящей БД.

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