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 )>]> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」