python 用Postgresql实现SQL在过滤器中使用日期

ryevplcw  于 2023-01-19  发布在  Python
关注(0)|答案(4)|浏览(129)

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

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

我试过几种方法。有些在SO上。但是没有一种看起来“现实”,因为有些确实会在ORM字段转换其他字符串格式?!?!而且不是一个简单的Date()(我说的Date是指Postgresql日期,而不是Python日期)
是否可以在ORM级别围绕查询的字段声明一个Simple Date()

myzjeezk

myzjeezk1#

以保证任何网络搜索都不会出错。

from sqlalchemy import Date, cast
from datetime import date

my_data = session.query(MyObject).\
filter(cast(MyObject.date_time,Date) == date.today()).all()
fafcakar

fafcakar2#

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

7kjnsjlb3#

在PostgreSQL中,如果date_time_field是表中的一个字段,那么查询器必须这样。从Mytable中选择 *,其中date_time_field = '2011-08-16'

c9x0cxw0

c9x0cxw04#

以下是同样适用于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()

相关问题