如何在SQLAlchemy中从日期字段获取月份和年份?

30

结果应该是日期对象

既然日期不能“删除”,那么将其设置为月份的第一天。

只保留月份和年份。


你想要仅存储月份和年份,还是只想显示这两个值? - Martijn Pieters
我希望能够存储(并按日期分组,因为我正在从不同的表中获取数据) - user1608977
你的问题不是特别清晰。这是 Python 代码,所以只需访问当前日期并将其修改为使用当前月份的第一天即可。 - Vaibhav Mishra
我在SQL Server中找到了一个类似问题的等效解决方案:https://dev59.com/N3I-5IYBdhLWcg3wlpYM。也许这能更清楚地回答问题。 - user1608977
@VaibhavMishra:这意味着我需要手动修改查询集中每一行的日期。我认为应该使用SQLAlchemy找到更优雅的解决方案。此外,我需要按月份和年份进行分组。 - user1608977
3个回答

56

您可以使用以下结构来筛选 Date 列,使用 yearmonth

.filter(extract('year', Foo.Date) == 2012)
.filter(extract('month', Foo.Date) == 12)

而且group_by也是可行的:

.group_by(sqlalchemy.func.year(Foo.Date), sqlalchemy.func.month(Foo.Date))

现在我没有测试过,但是我认为这可能会很慢,因为这些查询结果需要对整个表进行扫描,因此我建议您投入一些时间学习如何使用复合列

注意:extract()是从sqlalchemy.sql导入的。


2
谢谢,我也在group_by中使用了.filter(extract('year',Foo.Date))。我认为postgres中没有func.year函数,但不确定。 - user1608977
2
@user1608977 哎呀,看起来 func.year 是特定于MySQL的 :S - plaes
1
只想注意的是,我认为这个答案在某种程度上是很好的,因为最后有一条注释,并建议查看复合列。 - erewok
2
@plaes 不一定,你可以在这些表达式上创建索引,最终可以防止顺序扫描,例如在 foo 表上创建索引 idx_foo_year (extract('year' from bar))。 - drakorg
1
不要忘记导入:from sqlalchemy.sql import extract - WitnessTruth
显示剩余4条评论

1
使用下面的代码
.group_by(
   sqlalchemy.func.extract('year', Foo.Date), 
   sqlalchemy.func.extract('month', Foo.Date),
)

0
如果您像这样声明您的模式,
schema.Column('created', types.TIMESTAMP(), default=now()),

函数 now() 定义在同一模块中,可能像这样

def now():
    now_date = datetime.datetime.now()
    return now_date.replace(day=1)

根据group_by的要求,这里提到了一种方法。
您可以类似地修改小时和其他字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接