Python MySql MAX(DATE(Transaction_DATE))返回与DATE(MAX(Transaction_DATE))不同的类型
我有一个MySql 5.7事务表,其中有一个Python MySql MAX(DATE(Transaction_DATE))返回与DATE(MAX(Transaction_DATE))不同的类型,python,mysql,python-3.8,pymysql,Python,Mysql,Python 3.8,Pymysql,我有一个MySql 5.7事务表,其中有一个DATETIME列,transaction\u Date,它是索引的。我的Python 3.8.5程序感兴趣的是检索表上的最大事务日期(忽略时间部分)。有两种可能的查询(可能更多): 及 但是,根据我使用的查询,pymysql或mysql.connector(我使用哪一个并不重要)返回不同的数据类型作为结果,即第一个查询返回一个date.datetime实例,第二个查询返回一个str: 表格: CREATE TABLE `transaction` (
DATETIME
列,transaction\u Date
,它是索引的。我的Python 3.8.5程序感兴趣的是检索表上的最大事务日期(忽略时间部分)。有两种可能的查询(可能更多):
及
但是,根据我使用的查询,pymysql
或mysql.connector
(我使用哪一个并不重要)返回不同的数据类型作为结果,即第一个查询返回一个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))
节目:
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'>
这是我所期望的,所以这是一个相当复杂的问题。我浏览了
pymysql
源代码和一些MySQL文档。看起来数据库服务器返回字段描述符,然后模块使用这些描述符设置值的类。有多种转换器可用:。在底部,它将字段类型映射到方法
数据库服务器将max(date)
描述为一个变量字符串,因此模块将相应地进行操作。我不确定这种描述的具体原因,我想这是你问题的核心。需要对MySQL源代码进行一些挖掘,文档不是很详细
作为一种变通方法,将结果强制转换到某个日期确实可以使其按预期工作:
select cast(max(date(Transaction_Date)) as date) from transaction
当我使用另外两个连接器和Python 2时,也会出现同样的现象,因此MySQL似乎返回了您所说的内容,但我认为
max(date(datetime列))
的数据类型不正确。值得一提的是,第一个查询也更有效,因为它只使用索引。但是告诉我,您是如何确定服务器将第二个查询描述为返回VAR_字符串的?请参阅我的文章更新,其中我从第二个查询创建了一个临时表,并执行了显示列
,其中显示了预期的日期
类型。我在几个位置更改了本地模块以打印到控制台。在运行查询时,它打印了服务器提供的列类型,它对应于由定义的VAR_字符串。这很有创意。在执行create temporary table t1 as select max(DATE(Transaction_DATE))as d from
Transaction``时,返回VAR_STRING仍然很难协调它。@Booboo诸如此类的奇怪之处正是我10年前切换到Postgres的原因:)
select cast(max(date(Transaction_Date)) as date) from transaction