• Авторизация


От перемены мест слагаемых... 28-01-2012 23:13 к комментариям - к полной версии - понравилось!


Это для программистов.
Иными словами, если вы не знаете что такое SQL, то дальше вам будет неинтересно.

В школе нас учили: "От перемены мест слагаемых сумма не меняется".
И мы иногда по привычке продолжаем пользоваться этим правилом несмотря на пройденные позже всякие там геометрии Лобачевского и тп.
А зря.



Рассмотрим два SQL-запроса:
1. select date(now() - interval (day(now()) - 1 ) day - interval 1 month);
2. select date(now() - interval 1 month - interval (day(now()) - 1 ) day);

Вроде бы просто переставили местами вычитаемые величины.
Вроде бы запросы выдают одно и то же значение. Сегодня.
Сегодня.
Что эти запросы выдадут 31 декабря? Введем переменную @n вместо функции now(), для удобства.

set @n = '2011-12-31 01:01:01';
select date(@n - interval (day(@n) - 1 ) day - interval 1 month); -- выдает 2011-11-01
select date(@n - interval 1 month - interval (day(@n) - 1 ) day); -- выдает 2011-10-31

Сумма меняется, от перемены мест слагаемых.
В чем дело?
Давайте рассмотрим семантику запросов.
В первом запросе, мы берем текущий день месяца (day(now()), вычисляем предыдущий день месяца или ноль в случае если текущий день был 1 (day(now) - 1), вычитаем это число из текущей даты (now() - interval (day(now)) -1)) чтобы получить дату первого дня месяца, и вычитаем еще месяц чтобы получить дату начала предыдущего месяца.
Второй запрос делает наоборот: вначале вычитает месяц а потом текущий день месяца (минус один). Но если текущая дата 31 декабря, то вычев месяц мы получим 30 ноября, и вычев 30 дней мы получим не 1 ноября, как хотелось бы, а 31 октября: фэйл.
вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник От перемены мест слагаемых... | BernieF - Дневник BernieF | Лента друзей BernieF / Полная версия Добавить в друзья Страницы: раньше»