Pull to refresh

Comments 58

Ожидали увидеть "'2008-02-29' + INTERVAL 1 YEAR, — 2009-02-29"?
Я полагаю, что AgaFonOff ожидал увидеть '2008-02-29' + INTERVAL 1 YEAR, — 2009-03-01, но тогда трудно представить что было бы при '1500-02-29' + INTERVAL 509 YEAR
Скорее всего, NULL, так как 1500 год не високосный :)
почему это 1500 год не выскостный? :)
Не каждый четвертый год високосный, а только те, что не кратны 100, кроме тех, что кратны 400 — это во-первых.
Во-вторых, Григорианский календарь был введен в 1582 году.
Ого как всё сложно. А я всегда думал что просто каждый четвёртый год — высокостный)
Да, я ожидал 2009-03-01.
Полученный результат тоже по-своему логичен.
На эту тему есть интересное наблюдение — у меня есть двое знакомых, родившихся 29 февраля. В не високосные годы они отмечают день рождения 28 февраля, а не 1 марта, интересно — почему? :)
наверно потому что они родились в феврале, а не в марте :)
почему по своему? а по вашему в году должно быть 365 или 364 дней? помоему нельзя заменить день которого просто нет в другом году :)
то же самое — сначала перевод годов, а потом нормализация полученной даты.
Мне вот это напомнило почему-то

Хм, 29 февраля это вообще адский день, который существует просто для «торможения» календаря относительно истинного вращения Земли вокруг Солнца. То есть через год (365,25 суток) от 29 фераля 2008 года 0:00 будет 1 марта 2009 года 6:00… или 28 февраля? Чёрт, я запутался…
UFO just landed and posted this here
майэскьюэльный… (не сдержался :))
Мне кажется, что это нормльно — последний день месяца остался последним.
С другой стороны это не правильно потому что 60-й день года стал 59-м. Тут не может быть правильного варианта. Тут правильный тот — который вносит меньше всего путаницы и не взрывает мозг.
А если оба взрывают мозг, тогда что? )))
Я положил деньги на карточку 28го февраля в 16.00, а потратил их 29го в 15.00, а потом раз и получается при конвертации — сначала потратил, а потом положил )
UFO just landed and posted this here
select DAYOFYEAR('2008-03-01') — 61
select DAYOFYEAR('2009-03-01') — 60

я в этом году тоже намучался с этим 29-м февраля. Поздравления юзеров с днем рождения на сайте с марта начали отсылаться с ошибкой в день.

запрос был SELECT user_id FROM users WHERE DAYOFYEAR(birthday) = DAYOFYEAR(NOW())
Интересно, каков же новый запрос?
Может быть сверять месяц и число?)
Будет давать осечку в 1/1461 случае.
Что то на ночь совсем туго.((.
Не поясните, откуда берется сей процент?
Кажется, это 365*4+1

Только, непонятно, почему осечку-то будет давать.
Я хотел сказать что 1го из 1461 (т.е. того кто родился 29 февраля) будет поздравлять раз только раз в четыре года.
SELECT user_id FROM users WHERE DATE_FORMAT(birthday, '%m%d') = DATE_FORMAT(NOW(), '%m%d')
Сэнкс. Конечно нет смысла долго думать над абсолютным меньшинством родившихся 02-29, но я все ж хотел увидеть самое верное решение.
для 29 февраля надо ставить дополнительное условие OR (DATE_FORMAT(NOW(), '%m%d') = '0228' AND DATE_FORMAT(birthday, '%m%d') = ''0229')
Да, конечно, еще добавить поправку на то, что год високосный, чтобы не поздравлять дважды. Наверное самый простой способ — через + interval 1 day посмотреть, какой будет месяц.
И старить человека раз в 4 года сразу на 2?
а надо было как автор прописал
'2008-02-28' + INTERVAL 1 YEAR, — 2009-02-28
'2008-02-29' + INTERVAL 1 YEAR, — 2009-02-28
кто родился в високосный год просто получил бы поздравление 28.02 в невисокосный.
UFO just landed and posted this here
А что значит «на год старше»? Может через 365 дней?
select '2008-02-28' + INTERVAL 365 DAY; //2009-02-27
так 1 день теряется
Ну нет, тогда бы смещался день рождения у тех, кто родился не 29го февраля.)))
Если день рождения у меня 5 января, то именно 5 января мне уже +1 год (т.е. вот уже завтра будет 23). 29 февраля нет, но день рождения у человека в феврале, а не в марте, значит берем последний день февраля — 28. Наверное по-этому и принято праздовать ДР именно 28.

Если человек родился 29 февраля, а в невисокосный год ему исполняется 18, то я думаю, что 28 февраля уже можно заниматься сами знаете чем, а не ждать весны ;)
рожденные 29 февраля должны праздновать 28 февраля а не 1 марта
(те мускул совершенно правильно делает)
понять все достаточно просто астрономический год примерно на 1/4 суток длиннее чем календарный
те в конце года перед первым января прежде чем праздновать в 12 часов надо бы подождать 6 часов и только потом уже открывать бутылки с шампанским
те 1 января наступает на 6 часов раньше чем надо по астрономическому времени
тоже происходит и с 28 февралем оно наступает на 6 часов раньше
те человек родившийся 29 до 6 утра — становится на год старше 28 или 29 числа всегда
с остальными несколько сложнее могут отпраздновать как 28 так и 1 числа

както сложно получилось)
пожалуй проще по закону а не по правде))
Рожденные 29 февраля должны праздновать днюху только в високосный год! И считать число лет по числу 29х февраля, прошедших с рождения!
странный способ выбора даты… я бы предпочел выбирать
SELECT user_id FROM users WHERE DAYOFMONTH(birthday) = DAYOFMONTH(NOW()) AND MONTH(birthday) = MONTH(NOW())

но в этом случае рожденные 29.02.ХХХХ будут поздравлены раз в четыре года, но при этом ошибки не возникнет.
А еще можно делать в программном коде деление на виды запросов — если високосный год и сегодня 29 февраля, то один способ поиска юзеров, и вторая ветка логики — как у вас (или как я привел)
они и так официально празднуют ДР раз в 4 года :)
Ага и живут в 4 раза меньше (сегодня 25й день рождения нашего прадедушки, доооолгие летаааа :)
UFO just landed and posted this here
PostgreSQL

SELECT
'2008-02-27'::date + INTERVAL '1 YEAR', -- 2009-02-27
'2008-02-28'::date + INTERVAL '1 YEAR', -- 2009-02-28
'2008-02-29'::date + INTERVAL '1 YEAR', -- 2009-02-28
'2008-02-30'::date + INTERVAL '1 YEAR'; -- 2009-03-01
здесь ошибка:

SELECT '2008-02-30'::date + interval '1 year';
ERROR: date/time field value out of range: «2008-02-30»
'2008-02-30' => '2008-03-01'
это я пока пост набирал опечатался.
Проверил в mssql 2008. Все аналогично! Они сговорились!
— как проверял
select DATEADD(YYYY,1, '20080227')
select DATEADD(YYYY,1, '20080228')
select DATEADD(YYYY,1, '20080229')
select DATEADD(yyyy,1, '20080301')
выходит это фича, а не бага.
в конкретном случае я бы не использовал interval 1 year, как-то алгоритмически $date++ было-бы спокойней.
пардон, имелось ввиду $year++
Так, для справки, ГК РФ, ст. 192, ч.3


Если окончание срока, исчисляемого месяцами, приходится на такой месяц, в котором нет соответствующего числа, то срок истекает в последний день этого месяца.

Если в какой-нибудь Алабаме также, то можно считать, что Вы всё разрулили :)
Насчет Алабамы не знаю, но, например, Конвенция ООН об исковой давности в международной купле продаже товаров (принятая, в частности, и США, и большинством стран Европы, и Россией) гласит тоже самое

если надо прибавить именно дни, прибавьте дни, получите ожидаемый результат, а когда прибавляете именно год, результат тоже ожидаемый, по мне…
Последний раз високосная секунда вводилась 31 декабря 2008.
©
«А мужики-то не знают…» ©
о_0
Sign up to leave a comment.

Articles