MySql MAX(DATE(Transaction_Date)) returns 与 DATE(MAX(Transaction_Date)) 不同的类型
MySql MAX(DATE(Transaction_Date)) returns different type than DATE(MAX(Transaction_Date))
我有一个 MySql 5.7 事务 table,其中 DATETIME
列 Transaction_Date
已编入索引。我的 Python 3.8.5 程序有兴趣检索 table 上的最大交易日期(忽略时间部分)。有两种可能的查询(甚至更多):
select date(max(Transaction_Date)) from `transaction`
和
select max(date(Transaction_Date)) from `transaction`
但是,根据我使用的查询,pymysql
或 mysql.connector
(我使用哪个并不重要)returns 结果是不同的数据类型,即第一个查询的 date.datetime
实例和第二个查询的 str
实例:
Table:
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
?对于它的价值,我有另一个 table 和一个 DATE
列,当我 select 该列的 MAX
时,我返回一个 datetime.date
实例。那么,为什么我没有为 MAX(DATE(column_name))
返回 datetime.date
?
更新
mysql> create temporary table t1 as select max(date(Transaction_Date)) as d from `transaction`;
Query OK, 1 row affected (0.20 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> show columns from t1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| d | date | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.01 sec)
这是我所期望的,所以这是一个谜。
我查看了 pymysql
源代码和一些 MySQL 文档。它看起来像数据库服务器 returns 字段描述符,然后模块使用它来设置值的 class,有各种可用的转换器: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
我有一个 MySql 5.7 事务 table,其中 DATETIME
列 Transaction_Date
已编入索引。我的 Python 3.8.5 程序有兴趣检索 table 上的最大交易日期(忽略时间部分)。有两种可能的查询(甚至更多):
select date(max(Transaction_Date)) from `transaction`
和
select max(date(Transaction_Date)) from `transaction`
但是,根据我使用的查询,pymysql
或 mysql.connector
(我使用哪个并不重要)returns 结果是不同的数据类型,即第一个查询的 date.datetime
实例和第二个查询的 str
实例:
Table:
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
?对于它的价值,我有另一个 table 和一个 DATE
列,当我 select 该列的 MAX
时,我返回一个 datetime.date
实例。那么,为什么我没有为 MAX(DATE(column_name))
返回 datetime.date
?
更新
mysql> create temporary table t1 as select max(date(Transaction_Date)) as d from `transaction`;
Query OK, 1 row affected (0.20 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> show columns from t1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| d | date | YES | | NULL | |
+-------+------+------+-----+---------+-------+
1 row in set (0.01 sec)
这是我所期望的,所以这是一个谜。
我查看了 pymysql
源代码和一些 MySQL 文档。它看起来像数据库服务器 returns 字段描述符,然后模块使用它来设置值的 class,有各种可用的转换器: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