PyMySql: SELECT MAX (отметка времени) приводит к "Неверное значение даты и времени: '0000-00-00 00:00:00'" - PullRequest
3 голосов
/ 09 марта 2019

Я использую сервер MySQL 5.7 с двумя таблицами:

Table_A

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

Table_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) 

Когда я выполняю тот же запрос в Python (3.7), используя PyMySql (0.9.3), курсор создает следующее предупреждение:

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, так как предупреждениессылается на строку 3 в наборе результатов 2 строки.

Пытаясь сузить основную причину, я подумал, что это может быть связано с ошибкой агрегации значений NULL в столбце метки времени, поэтому я обновил запрос, чтобы вычислять только MAX (b.created_at), когда COUNT(table_b.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.

Я нашел другие вопросы, обсуждающие то же самое предупреждение, но они касаются случаев, когда люди пытаются вставить / обновить '0000-00-00 00:00:00'значения или фильтруются по ним .

...