簡體   English   中英

MySql MAX(DATE(Transaction_Date)) 返回與 DATE(MAX(Transaction_Date)) 不同的類型

[英]MySql MAX(DATE(Transaction_Date)) returns different type than DATE(MAX(Transaction_Date))

我有一個帶有DATETIMETransaction_Date的 MySql 5.7 事務表,該表已被索引。 我的 Python 3.8.5 程序對檢索表上的最大交易日期感興趣(忽略時間部分)。 有兩種可能的查詢(甚至更多):

select date(max(Transaction_Date)) from `transaction`

select max(date(Transaction_Date)) from `transaction`

但是,根據我使用的查詢, pymysqlmysql.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))

印刷:

2021-01-19 <class 'datetime.date'>
2021-01-19 <class 'str'>

誰能解釋為什么第二個查詢沒有返回datetime.date 對於它的價值,我有另一個帶有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 文檔。 看起來數據庫服務器返回字段描述符,然后模塊使用它在值上設置 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM