我有一个表中的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 helper函数转换为2019-07-04 23:19:59.920630 ...所以我需要我的查询在所有查询中都包含该datetime条目记录“ 2019年7月4日”
所以我正在运行SQLAlchemy查询以获取不同日期的列表
>>>uniquedays=db.session.query(func.distinct(func.DATE(TableClass.timestamp))).all()
,但我刚刚意识到这将返回一个日期列表,该日期可能没有用户所在地区的任何记录...在我的示例中,7月5日没有我的时区的任何条目,但将其返回为唯一的一天。
所以我也可以像这样返回datetimelist:
>>>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数据库进行生产。
答案 0 :(得分:0)
理想情况下,这将在数据库级别完成。在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,但是如果您马上就要切换到实际的数据库,那么麻烦就不值得了。