SQLalchemy 按星期几过滤日期时间

SQLalchemy filter cast datetime by day of week

我有一个“日期时间”列,我正在尝试按星期六发生的所有事情来过滤该列。

我可以通过将日期时间转换为日期并将其与日期字符串进行比较来过滤日期时间,如下所示:

session.query(SQL_table).filter(cast(SQL_table.datetime_column, Date) == '2020-7-1').all()

但是我怎么说我希望该列 return 一周中某一天的所有内容?我试过这个:

session.query(SQL_table).filter(cast(SQL_table.datetime_column, Date).strftime('%A') == 'Saturday').all()

这给了我错误:

AttributeError: Neither 'Cast' object nor 'Comparator' object has an attribute 'strftime'

那么如何将列转换为工作日并按特定日期过滤呢?

要解决您的问题,您可以使用 sqlalchemy 包中的函数生成器指定用户用来提取 SQL 方言中星期几的函数。例如,Transact-SQL 有 format() 函数,Oracle SQL 有 to_char(date_column, 'D') 提取星期几的函数。使用这种方法,您可以指定适合您的 SQL 方言的自定义函数。

from sqlalchemy import func

day_of_week_num = 6
day_of_week_str = 'Sunday'

# Example for Transact-SQL
session.query(SQL_table).filter(func.format(SQL_table.datetime_column, 'dddd') == day_of_week_str).all()

# Example for Oracle SQL
session.query(SQL_table).filter(func.to_char(SQL_table.datetime_column, 'D') == day_of_week_num).all()

尝试使用 func.dayofweek

from sqlalchemy import func

...

# 1 = Sunday, 2 = Monday, ..., 7 = Saturday.
# Therefore, to get Saturday:

session.query(SQL_table).filter(func.dayofweek(
                    SQL_table.datetime_column) == 7).all()