数据库时区配置

3 篇文章 0 订阅
2 篇文章 0 订阅
问题描述:

Django ORM 的Q对象查询,<字段名>__range 和 __date__range 的查询结果不一样,__range能正常查询出记录, __date__range 一条都查不出来

from django.db.models import Q
import datetime
from_date = datetime.date(2021, 4, 1)
end_date = datetime.date(2021, 4, 28)

# 此时数据库中有一条create_time 2021-4-5 的数据
query_term = Q(create_time__date__range=[from_date, end_date])
SendUserTaskRewardRecord.objects.filter(query_term)

# 查询结果为空

query_term = Q(create_time__date__range=[from_date, end_date])
SendUserTaskRewardRecord.objects.filter(query_term)
# 有查询结果
先说结论

mysql中缺失了时区转换函数

解决办法:https://dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html

# 命令行执行以下内容
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
解决过程:
>>>	print(SendUserTaskRewardRecord.objects.filter(query_term).query)

SELECT `task_sendusertaskrewardrecord`.`id`, `task_sendusertaskrewardrecord`.`create_time`, `task_sendusertaskrewardrecord`.`task_id`, `task_sendusertaskrewardrecord`.`username` FROM `task_sendusertaskrewardrecord` WHERE DATE(CONVERT_TZ(`task_sendusertaskrewardrecord`.`create_time`, 'UTC', 'UTC')) BETWEEN 2021-04-01 AND 2021-04-28

# 注意 CONVERT_TZ 函数, 这是mysql对时区的支持

# 进入 mysql 交互界面
select count(*) from mysql.time_zone_name;
# 返回0,意思是mysql还没有配置时区表
# 根据 https://dev.mysql.com/doc/refman/8.0/en/mysql-tzinfo-to-sql.html
# 进 /usr/share/zoneinfo 看看有没有这个目录或者里面有没有东西,在系统命令行(iterm)执行对应load time table 的命令

# iterms:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

# mysql 交互界面:
select count(*) from mysql.time_zone_name;
# 现在就有返回了,回去orm发现查询也正常了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值