Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MySql MAX(DATE(Transaction_DATE))返回与DATE(MAX(Transaction_DATE))不同的类型_Python_Mysql_Python 3.8_Pymysql - Fatal编程技术网

Python MySql MAX(DATE(Transaction_DATE))返回与DATE(MAX(Transaction_DATE))不同的类型

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` (

我有一个MySql 5.7事务表,其中有一个
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