使用Postgresql使Sqlalchemy在过滤器中使用日期

时间:2011-08-16 09:01:14

标签: postgresql datetime sqlalchemy

4 个答案:

答案 0 :(得分:49)

使用@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()

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

答案 1 :(得分:10)

可以使用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

答案 2 :(得分:1)

在postgreSQL中如果date_time_field是你表中的一个字段,则quer必须这样。 从Mytable中选择*,其中date_time_field ='2011-08-16'

答案 3 :(得分:0)

以下是通用解决方案,该解决方案也可在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()