如何解决MySql MAX(DATE(Transaction_Date)) 返回与 DATE(MAX(Transaction_Date)) 不同的类型
我有一个带有 DATETIME
列 Transaction_Date
的 MySql 5.7 事务表,该表已编入索引。我的 Python 3.8.5 程序对检索表上的最大交易日期感兴趣(忽略时间部分)。有两种可能的查询(可能更多):
select date(max(Transaction_Date)) from `transaction`
和
select max(date(Transaction_Date)) from `transaction`
但是,根据我使用的查询,pymysql
或 mysql.connector
(我使用哪个无关紧要)返回不同的数据类型作为结果,即 {{1} } 实例用于第一个查询,date.datetime
用于第二个:
表格:
str
计划:
CREATE TABLE `transaction` (
`Transaction_ID` varchar(32) NOT NULL,`Transaction_Date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `transaction`
ADD PRIMARY KEY (`Transaction_ID`),ADD KEY `Transaction_Date` (`Transaction_Date`);
打印:
import pymysql
database = 'xxxx'
user_id = 'xxxx'
password = 'xxxx'
conn = pymysql.connect(db=database,user=user_id,passwd=password,charset='utf8mb4',use_unicode=True)
cursor = conn.cursor()
cursor.execute('select date(max(Transaction_Date)) from `transaction`')
row = cursor.fetchone()
d = row[0]
print(d,type(d))
cursor.execute('select max(date(Transaction_Date)) from `transaction`')
row = cursor.fetchone()
d = row[0]
print(d,type(d))
谁能解释为什么第二个查询没有返回 2021-01-19 <class 'datetime.date'>
2021-01-19 <class 'str'>
?对于它的价值,我有另一个带有 datetime.date
列的表,当我选择该列的 DATE
时,我会返回一个 MAX
实例。那么为什么我没有为 datetime.date
返回 datetime.date
?
更新
MAX(DATE(column_name))
这是我所期望的,所以这是一个难题。
解决方法
我查看了 pymysql
源代码和一些 MySQL 文档。看起来数据库服务器返回字段描述符,然后模块使用它来设置值的类,有各种可用的转换器:https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/converters.py。在底部,它将字段类型映射到方法。
数据库服务器将 max(date)
描述为 VAR_STRING,因此模块会相应地进行。我不确定此描述的具体原因,我认为这是您问题的核心。需要挖掘一些 MySQL 源代码,文档不是很详细。
作为一种解决方法,将结果转换为日期确实可以使其按预期工作:
select cast(max(date(Transaction_Date)) as date) from transaction
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。