【问题标题】:Sqlalchemy convert epoch time to date in group bySqlalchemy 将纪元时间按组转换为日期
【发布时间】:2019-04-21 15:17:28
【问题描述】:

我正在使用 Sqlalchemy 作为 PSQL 数据库的 ORM。我的时间戳在我的数据库中存储为纪元时间,例如 1525868337991。(以毫秒为单位)

我正在编写查询以获取特定日期的员工人数(按日期分组)。我找不到任何方法可以在我的 ORM 查询中将 epoch 转换为 date,就像 psql 有 to_timestamp。查询写在下面:

employees_details = db.session.query(
      func.count(EmployeeInfo.id).label("employee_count"), EmployeeInfo.employee_created_on, EmployeeSourceInfo.employee_source_display_name
    ).join(
      EmployeeSourceInfo, EmployeeInfo.lead_source_id == EmployeeSourceInfo.id
    ).group_by(func.as_utc(EmployeeInfo.employee_created_on), EmployeeSourceInfo.employee_source_display_name).all()

【问题讨论】:

  • 那你为什么不直接使用to_timestamp()的单参数形式?
  • @IljaEverilä 我没有 SqlAlchemy 有 to_timestamp() 作为它的 psql。如果它在那里,请告诉我如何使用它..
  • SQLAlchemy 中的 func 是通用的。您可以使用它来生成几乎任何必要的函数表达式。 func.xyzzy(1, 2)就好了,如果你的数据库有这样的功能。
  • @IljaEverilä 谢谢,我可以得到,但我仍然无法从中提取日期。下面是查询func.timezone('UTC',func.to_timestamp(EmployeeInfo.employee_created_on/1000)) 我除以 1000,因为我的时间戳以毫秒为单位
  • 使用上述查询我无法执行 group_by,因为日期作为日期时间的实例返回,如 datetime.datetime(2018, 4, 9, 7, 34, 2, 744000)

标签: python python-2.7 orm sqlalchemy flask-sqlalchemy


【解决方案1】:

SQLAlchemy 中的func 是通用的,可用于生成几乎任何 SQL 函数表达式。考虑到这一点,您可以简单地将func.as_utc 替换为

func.to_timestamp(EmployeeInfo.employee_created_on / 1000.0)

然后将其截断为一个日期,或者将其转换为一个日期:

from sqlalchemy import Date

func.to_timestamp(EmployeeInfo.employee_created_on / 1000.0).cast(Date)

或使用 Postgresql 特定函数 date_trunc() 将生成的时间戳减少到天精度:

func.date_trunc('day', func.to_timestamp(EmployeeInfo.employee_created_on / 1000.0))

【讨论】:

  • 前一种转换日期的方法是一种很好的方法,但是它将日期作为日期时间类的实例返回。 datetime.date(2018, 4, 9) 。有没有办法将它们转换为查询本身的确切日期?没有它,我必须运行一个循环并将每个日期转换为 isoformat
  • “确切日期”是什么意思?
  • 确切日期 我的意思是格式为 2018-04-09 (YYYY-mm-dd) isoformat,而上面的 cast 查询返回日期作为日期时间类的实例 datetime.date(2018, 4, 9)
猜你喜欢
  • 2018-04-24
  • 2011-12-06
  • 2012-09-06
  • 2012-11-08
  • 2019-01-15
  • 1970-01-01
  • 2016-09-15
  • 2021-12-31
  • 2015-01-23
相关资源
最近更新 更多