... это, очевидно, выполняется сравнение 'string'
Нет - если формат даты / времени соответствует поддерживаемому формату, MySQL выполняет неявное преобразование, чтобы преобразовать значение в DATETIME на основе столбца, с которым оно сравнивается. То же самое происходит с:
WHERE int_column = '1'
... где строковое значение «1» преобразуется в INTeger, поскольку тип данных int_column
- INT, а не CHAR / VARCHAR / TEXT.
Если вы хотите явно преобразовать строку в DATETIME, наилучшим выбором будет функция STR_TO_DATE :
WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')