MySql, даты и WTF

14 мар. 2012 г. | | |

Тянуть не буду, сразу в бой:
SELECT TO_DAYS('05.03.2012') as `05.03.2012`,TO_DAYS('01.02.2012') as `01.02.2012`, TO_DAYS('28.02.2012')  as `28.02.2012`
Результат:

Опаньки. Нужно отформатировать даты:
SELECT TO_DAYS('2012-03-05') as `05.03.2012`,TO_DAYS('2012-02-01') as `01.02.2012`, TO_DAYS('2012-02-28')  as `28.02.2012`
Результат:

Это уже похоже на правду. Заюзаем DATE_FORMAT т.к. даты приходят от клиента:
SELECT TO_DAYS(DATE_FORMAT('05.03.2012', '%Y-%m-%d')) as `05.03.2012`,
TO_DAYS(DATE_FORMAT('01.02.2012', '%Y-%m-%d')) as `01.02.2012`,
TO_DAYS(DATE_FORMAT('28.02.2012', '%Y-%m-%d')) as `28.02.2012`
Результат:

WTF? Как из даты в феврале получилось дней больше, чем из даты в марте? И вобще, что за удивительная разница в 9861 день между 1-м и 28-м февраля? Как он это делает?
Интуиция подсказывает проверить DATE_FORMAT:
SELECT DATE_FORMAT('05.03.2012', '%Y-%m-%d') as `05.03.2012`,
DATE_FORMAT('01.02.2012', '%Y-%m-%d') as `01.02.2012`,
DATE_FORMAT('28.02.2012', '%Y-%m-%d') as `28.02.2012`
Результат:
А потому что
Although MySQL tries to interpret values in several formats, date parts must always be given in year-month-day order (for example, '98-09-04'), rather than in the month-day-year or day-month-year orders commonly used elsewhere (for example, '09-04-98', '04-09-98'). [мануал]
и даты форматировать надо на клиенте, не за чем лишний раз мускул качать!

0 коммент.:

Отправить комментарий