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)>]>