Так и нафига вам сдался STR_TO_DATE? Чтобы дату приводить к строке, потом пытаться ипользуя не тот формат строки привести обратно в дату и сравнивать с литералом, попутно отстрелив всякую возможность использовать индексы? created_at < STR_TO_DATE('01.01.2017', '%d.%m.%Y')
Из комментариев created_at является нормальным timestamp или datetime полем. Поэтому его не только не нужно приводить к строке и парсить повторно в дату (с неверным форматом к тому же), но ещё и очень вредно так делать, т.к. исключает возможность использования индекса.
created_at < STR_TO_DATE('01.01.2017', '%d.%m.%Y')
Дату возможно отформатировать в Y-m-d формат на приложении, это уже как удобнее.