Django按月和年过滤

Posted

技术标签:

【中文标题】Django按月和年过滤【英文标题】:Django filter by month and year 【发布时间】:2014-02-12 17:20:39 【问题描述】:

我正在尝试按月和年过滤日期时间字段。由于某些未知原因,在输入月份和年份时,我返回了一个空集。

型号:

class SomePost(model.Models):
    timestamp = models.DateTimeField(auto_now_add=True)

查询:

p = SomePost.objects.filter(timestamp__year=2014, timestamp__month=1)

我认为这与月份有关,但我只是看不出我做错了什么。

编辑

好的,所以我将模型 datetimefield 转换为 datefield 并且查询有效。

生成的 sql 是这样的:

SELECT 
`a_post`.`id`, 
`a_post`.`title`, 
`a_post`.`slug`, 
`a_post`.`text`, 
`a_post`.`timestamp`, 
`a_post`.`published` FROM `a_post` 
WHERE EXTRACT(MONTH FROM `a_post`.`timestamp`) = 2
ORDER BY `a_post`.`timestamp` DESC;

但是当我将它转换回日期时间字段时,sql 是:

SELECT 
`a_post`.`id`, 
`a_post`.`title`,
`a_post`.`slug`, 
`a_post`.`text`, 
`a_post`.`timestamp`,
 `a_post`.`published` FROM `a_post` 
WHERE EXTRACT(MONTH FROM CONVERT_TZ(`a_post`.`timestamp`, 'UTC', UTC)) = 1 
ORDER BY `a_post`.`timestamp` DESC

看起来好像是 conver_tz 导致了问题。如果我要在查询返回结果时删除convert_tz函数。

对这里发生的事情有什么想法吗?

【问题讨论】:

您确定数据库中有该年/月组合的记录吗? 是的,我在 2014 年 1 月每天都在填充​​span> 看看***.com/questions/1317714/… - 它应该对你有帮助: 会不会和本地化有关? 除了缺少 'objects' 的 's' 之外,这个查询不可能出错,所以请尝试寻找其他地方...您是否尝试过其他查询?填充模型后,您是否重新加载了外壳? 【参考方案1】:

我遇到了同样的问题,这对我来说很有效,我希望它对你有用。

在 Django-1.11.5 上测试

 p = SomePost.objects.filter(timestamp__year='2014').filter(timestamp__month='1')

更多信息请见here

【讨论】:

【参考方案2】:

我在mysql Ver 14.14 Distrib 5.6.33 中遇到了同样的问题。

这是由空时区表引起的。我已经通过填充它们来修复它:

shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

在MySQL CONVERT_TZ() 上阅读答案很有用。

【讨论】:

以上是关于Django按月和年过滤的主要内容,如果未能解决你的问题,请参考以下文章

按月和日过滤 django 日期时间字段的问题

Django:为当前用户过滤数据库

仅按月和年选择数据

在 postgresql 中按月和年对查询结果进行分组

LINQ:在日期时间字段中按月和年分组

如何在 Jooq 中按月和年将毫秒翻译成日期和分组?