Django DatetimeField字段__month、__day查询不生效

Django: 3.2
MySQL: 5.7.35
MySQL: 8.0.28

 

查询:

>>> qs.values('created_time')
<QuerySet [{'created_time': datetime.datetime(2022, 2, 9, 3, 23, 10, 403196, tzinfo=<UTC>)}]>  

MySQL 5.7:

>>> qs.filter(created_time__month=2)
<QuerySet [<Projects: Projects object (1)>]>

MySQL 8.0:

>>> qs.filter(created_time__month=2)
<QuerySet []>


打印出查询SQL:

>>> print(qs.filter(created_time__month=2).query)
SELECT `app_base_projects`.`id` FROM `app_base_projects` WHERE EXTRACT(MONTH FROM CONVERT_TZ(`app_base_projects`.`created_time`, 'UTC', 'Asia/Shanghai')) = 2

官方参考链接:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#month

在不同数据版本执行一下SQL发现差异体现在 CONVERT_TZ

MySQL 5.7:

MySQL 8.0:

 原因:MySQL 8.0未设置TZ表  导致 CONVERT_TZ 返回 null ,如果尚未将时区表加载到mysql中,则会发生这种情况。

 

解决方法:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

 

然后在MySQL8.0查询正常

>>> qs.filter(created_time__month=2)
<QuerySet [<Projects: Projects object (1)>]>

  

posted @   富贵号  阅读(206)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示