DATE
проверяет действительность, а str_to_date
- нет.
mysql> select str_to_date('2010-02-31', '%Y-%m-%d');
+---------------------------------------+
| str_to_date('2010-02-31', '%Y-%m-%d') |
+---------------------------------------+
| 2010-02-31 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> select str_to_date('2010-04-31', '%Y-%m-%d');
+---------------------------------------+
| str_to_date('2010-04-31', '%Y-%m-%d') |
+---------------------------------------+
| 2010-04-31 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> select date('2010-02-31');
+--------------------+
| date('2010-02-31') |
+--------------------+
| NULL |
+--------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select date('2010-04-31');
+--------------------+
| date('2010-04-31') |
+--------------------+
| NULL |
+--------------------+
1 row in set, 1 warning (0.00 sec)
ОБНОВЛЕНИЕ согласно @Aziz, DATE
проверит, является ли дата реальной или нет. Согласно моему тесту, кажется, str_to_date
не проверяет.