【问题标题】:Make Sqlalchemy Use Date In Filter Using Postgresql使用 Postgresql 在过滤器中制作 Sqlalchemy 使用日期
【发布时间】:2011-10-27 21:32:11
【问题描述】:

我正在尝试在 Sqlalchemy 中执行以下查询。

Select * from "Mytable" where Date(date_time_field) = "2011-08-16";

我尝试了几种方法。一些在这里。 但是没有一个似乎是“现实的”,因为有些人会强制转换其他字符串格式?!?!而不是一个简单的 Date() (按日期,我​​的意思是 Postgresql 日期而不是 Python 日期) 在 ORM 字段中。

是否可以在 ORM 级别围绕查询字段声明一个 Simple Date() ?

最好的问候 安东尼奥

【问题讨论】:

    标签: python postgresql datetime sqlalchemy


    【解决方案1】:

    使用@Ants Aasma 评论。

    并为任何网络搜索保持清洁。

    from sqlalchemy import Date, cast
    from datetime import date
    
    my_data = session.query(MyObject).\
    filter(cast(MyObject.date_time,Date) == date.today()).all()
    

    感谢所有试图解决这个问题的人:)

    【讨论】:

    • 根据我的经验,如果你使用 SQLite 进行测试,func.date 会更好,因为cast 不起作用。
    【解决方案2】:

    可以使用 func 模块调用本机 SQL 函数

    from sqlalchemy import func
    from datetime import date
    
    my_data = session.query(MyObject).filter(
        func.date(MyObject.date_time) == date.today()
    ).all()
    

    致电func.date

     from sqlalchemy import select, func
     print select([func.date('2004-10-19 10:23:54')])
    

    将产生以下 SQL:

     SELECT date(:date_2) AS date_1
    

    您还可以声明自己的 SQL 函数快捷方式:

    from sqlalchemy.sql.functions import GenericFunction
    from sqlalchemy.types import DateTime
    
    class convert_tz(GenericFunction):
        """
        Sqlalchemy shortcut to SQL convert timezone function
    
        :param DateTime datetime
        :param str from_tz: The timezone the datetime will be converted from
        :param str to_tz: The timezone the datetime will be converted from
        :returns: Datetime in another timezone
        :rtype: DateTime or None if timezones are invalid
    
        """
        type = DateTime
    

    像这样使用:

    from sqlalchemy import select, func
    print select([func.convert_tz(func.now(), '+00:00', '-05:00')])
    

    会生成如下SQL:

    SELECT convert_tz(now(), :param_1, :param_2) AS convert_tz_1
    

    【讨论】:

    • 这篇文章被自动标记为低质量,因为它太短/只有代码。您介意通过添加一些文本来解释它如何解决问题来扩展它吗?
    • 我添加了对文档的解释和参考。
    【解决方案3】:

    在 postgreSQL 中,如果 date_time_field 是表的一个字段,那么 quer 必须像这样。 Select * from Mytable where date_time_field = '2011-08-16'

    【讨论】:

    • 您好,更准确地说,该字段是没有时区的时间戳:)
    • 简单的方法就是将其转换为日期,从 mytable 中选择 * where cast(date_time_field as date)='2011-08-16';在 pgsql 中转换的简写是 :: 方法,如下所示: select * from mytable where date_time_field::date='2011-08-16';但这不是 SQL 规范标准,也不能移植。如果您不需要可移植,那么 :: 方法看起来更简洁,并且也更容易记住语法。但是,您使用 date(date_time_field) 的方法也应该可以工作。
    • 你好 Scott,谢谢,现在问题实际上是将它移植到 Sqlalchemy 中,我今天会试一试 :)
    • 简单:cast(MyObj.date_time_field, Date) == date.today()
    【解决方案4】:

    以下是也适用于 SQLite 的通用解决方案:

    day = date.today()
    next_day = day + timedelta(days=1)
    my_data = session.query(MyObject).filter(MyObject.date_time >= day,  MyObject.date_time < next_day).all()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      相关资源
      最近更新 更多