PyMySql:SELECT MAX(时间戳)导致“不正确的日期时间值:'0000-00-00 00:00:00'”

时间:2019-03-09 01:29:19

标签: mysql mysql-python pymysql

我正在运行带有两个表的MySQL 5.7服务器:

表_A

id   name
.........
1    foo
2    bar   

表B

  id   parent_id   name    created_at (default: CURRENT_TIMESTAMP)
  ................................................................
  1    1           x       2019-01-01 10:00:00  
  2    1           y       2019-12-31 22:00:00

我有此查询来获取一个Table_B条目计数,该计数按Table_A名称分组,并带有最新Table_B条目的时间戳:

SELECT 
    a.name,
    COUNT(b.id) AS entry_count_in_b,
    MAX(b.created_at) AS last_entry_in_b
FROM 
    Table_A a
LEFT JOIN 
    Table_B b ON b.parent_id = a.id
GROUP BY 1

MySQL命令行客户端返回预期的输出:

+------+------------------+---------------------+
| name | entry_count_in_b | last_entry_in_b     |
+------+------------------+---------------------+
| bar  |                0 | NULL                |
| foo  |                2 | 2019-12-31 22:00:00 |
+------+------------------+---------------------+
2 rows in set (0.0267 sec) 

但是,当我使用PyMySql(0.9.3)在Python(3.7)中运行相同的查询时,光标会生成以下警告:

lib/python3.7/site-packages/pymysql/cursors.py:329: Warning: (1292, "Incorrect datetime value: '0000-00-00 00:00:00' for column 'last_entry_in_b' at row 3") 

这可能是PyMySql中的错误,因为警告引用了2行结果集中的第3行。

试图缩小根本原因,我认为这可能与时间戳列中NULL值聚合中的错误有关,因此我将查询更新为仅在COUNT(table_b)时计算MAX(b.created_at)。 id)> 1:

SELECT 
    a.name,
    COUNT(b.id) AS entry_count_in_b,
    CASE
        WHEN COUNT(b.id) = 0 THEN NULL
        ELSE MAX(b.created_at) 
    END AS last_entry_in_b
FROM 
    Table_A a
LEFT JOIN 
    Table_B b ON b.parent_id = a.id
GROUP BY 1

这会产生相同的警告,但现在引用名为“ tmp_field_0”的列。

lib/python3.7/site-packages/pymysql/cursors.py:329: Warning: (1292, "Incorrect datetime value: '0000-00-00 00:00:00' for column 'tmp_field_0' at row 3")

我想知道以前是否有人看过/解决过这个问题?如果没有,我将为PyMySql提出问题。

我发现了其他一些讨论相同警告的问题,但它们涵盖了人们尝试insert / update '0000-00-00 00:00:00' valuesfiltering for them的情况。

0 个答案:

没有答案