【问题标题】:Query for a single day with respect to timezone查询关于时区的一天
【发布时间】:2019-11-16 08:05:10
【问题描述】:

我的表中有一个 UTC 日期时间列表。我想在 local 时区获取不同的日期,并再次获取每个日期的条目数,对于 local 时区。

我确定我把这个问题复杂化了,但我对 Python 和 SQLAlchemy 还是很陌生,更不用说日期、时间和时区了。

我正在使用带有 default=utcnow() 的列将我的时间戳存储在 UTC...这很好用: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...所以我需要我的查询在我的查询中包含该日期时间条目“2019 年 7 月 4 日”的记录

所以我运行 SQLAlchemy 查询来获取不同日期的列表

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

但我刚刚意识到这是返回的日期列表可能没有用户区域设置的任何记录......在我的示例中,7 月 5 日没有我的时区的任何条目 - 但它被返回为独一无二的一天。

所以我也可以像这样返回日期时间列表:

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

但现在我刚刚得到了这个日期时间(我假设)元组的列表:

>>>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 日期时间转换为我的本地时间:

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

我现在正在使用 SQLite,但打算切换到 MySQL 数据库进行生产。

【问题讨论】:

  • 您使用的是哪个数据库?
  • 我现在正在使用 SQLite,但稍后将连接到 MySQL。好问题-添加到我的原始帖子中。 SQLAlchemy 不应该为我粗略处理这些差异吗?

标签: python datetime flask sqlalchemy timezone


【解决方案1】:

理想情况下,这将在数据库级别完成。在 MySQL 中,它可能看起来像这样:

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

不幸的是, 但是,SQLite doesn't support 完全灵活的时区转换。因此,在您切换之前,您必须在 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's hybrid properties,但如果您很快就要切换到真正的数据库,那么这可能不值得。

【讨论】:

  • 哈哈,在这一点上,绝对不是数百万行几乎是游乐场应用程序:) 我了解 SQLite 支持...我不妨早点而不是晚点换成 MySQL。但这确实奏效了!我会继续玩,但至少我得到了预期的结果!
  • 如果有人看到这一点,我按照 Nick K9 的第一个建议让 MySQL 正常工作,让数据库处理转换。从 SQLite 到 MySQL 的重构很顺利,只是一些小的调整。 重要提示您需要将 MySQL 时区表安装到您的数据库中。 Here's some info on how.
  • @nick-k9 sqlite 是一个真实的数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2019-08-01
  • 2014-01-11
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多