Django | Mysql 返回不合法的日期时间对象
1 错误描述
在查询数据集中的日期时间对象时
In [38]: Device.objects.datetimes('latest_alarm_time', 'month')
Out[38]: SELECT DISTINCT
CAST(DATE_FORMAT(CONVERT_TZ(`device_device`.`latest_alarm_time`, 'UTC', 'Asia/Shanghai'), '%Y-%m-01 00:00:00') AS DATETIME) AS `datetimefield` FROM `device_device` WHERE `device_device`.`latest_alarm_time` IS NOT NULL ORDER BY `datetimefield` ASC LIMIT 21
然后报错
ValueError: Database returned an invalid datetime value. Are time zone definitions for your database installed?
2 解决问题
实际情况,数据库中是有数据,目测月份提取失败;到 mysql 执行了下
mysql root@localhost:py365> select convert_tz('2018-05-10 12:30:00', 'UTC', 'Asia/Shanghai');
+-------------------------------------------------------------+
| convert_tz('2018-05-10 12:30:00', 'UTC', 'Asia/Shanghai') |
|-------------------------------------------------------------|
| NULL |
+-------------------------------------------------------------+
果然,结果返回令人诧异的 NULL
看了下 Django orm 的 datetimes 官方文档
Note
This function performs time zone conversions directly in the database. As a consequence, your database must be able to interpret the value of tzinfo.tzname(None). This translates into the following requirements:
SQLite: no requirements. Conversions are performed in Python with pytz (installed when you install Django).
PostgreSQL: no requirements (see Time Zones).
Oracle: no requirements (see Choosing a Time Zone File).
MySQL: load the time zone tables with mysql_tzinfo_to_sql.
即 mysql 需要使用 mysql_tzinfo_to_sql 载入时区表,接着跳到 https://dev.mysql.com/doc/ref...
按照 mysql 官方的文档
For the first invocation syntax, pass the zoneinfo directory path name to mysql_tzinfo_to_sql and send the output into the mysql program. For example:
我需要按照以下命令执行
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
然后再次执行上面执行过的转换语句
mysql root@localhost:py365> select convert_tz('2018-05-10 12:30:00', 'UTC', 'Asia/Shanghai');
+-------------------------------------------------------------+
| convert_tz('2018-05-10 12:30:00', 'UTC', 'Asia/Shanghai') |
|-------------------------------------------------------------|
| 2018-05-10 20:30:00 |
+-------------------------------------------------------------+
yes,返回了正确的结果;
在 shell 中 执行数据库查询语句
In [45]: Device.objects.datetimes('latest_alarm_time', 'month')
Out[45]: SELECT DISTINCT CAST(DATE_FORMAT(CONVERT_TZ(`device_device`.`latest_alarm_time`, 'UTC', 'Asia/Shanghai'), '%Y-%m-01 00:00:00') AS DATETIME) AS `datetimefield` FROM `device_device` WHERE `device_device`.`latest_alarm_time` IS NOT NULL ORDER BY `datetimefield` ASC LIMIT 21
Execution time: 0.000591s [Database: default]
<QuerySet [datetime.datetime(2018, 5, 1, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)]>
正常,so 问题解决,看来还得认真看文档呀
黑月亮
点滴记录,步步成长
被 1 篇内容引用
推荐阅读
centos | 修改静态 IP
设置 Centos 为使用静态 IP1 修改网络配置 {代码...} 修改后的内容如下 {代码...} 2 重启网络服务 {代码...} 3 查看地址 {代码...} 参考来源:[链接]
青阳半雪阅读 1.8k评论 3
万字长文~vue+express+mysql带你彻底搞懂项目中的权限控制(附所有源码)
所谓的权限,其实指的就是:用户是否能看到,以及是否允许其对数据进行增删改查的操作,因为现在开发项目的主流方式是前后端分离,所以整个项目的权限是后端权限控制搭配前端权限控制共同实现的
水冗水孚赞 11阅读 1.5k
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
民工哥赞 11阅读 1k
一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...
骑牛上青山赞 8阅读 2.2k评论 2
Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...
京东云开发者赞 2阅读 916
2023最新MySQL高频面试题汇总
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~
程序员大彬赞 3阅读 957
MySql 共享锁 排他锁 意向锁 记录锁 间隙锁 临键锁
官方文档InnoDB Locking个人理解MySql的锁按照锁的【级别】可分为行级锁和表级锁MySql的锁按照锁的【模式】可分为共享锁和排他锁MySql的锁按照锁的【范围】可分为记录锁,间隙锁,临键锁,意向锁共享锁(Share Lo...
老污的猫赞 3阅读 5k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。