В интервалах дат MySQL 1 МЕСЯЦ совпадает с 30-ДНЕВНЫМ? Является ли 1 КВАРТАЛ таким же, как 3 МЕСЯЦА? И так далее?

#mysql #date #intervals

#mysql #Дата #интервалы

Вопрос:

Я пытаюсь написать PHP-скрипт, который будет обрабатывать повторяющиеся платежи каждый месяц, квартал, год и т.д. Этот скрипт будет выполняться как ночное задание Cron.

Я не хочу столкнуться с ситуацией, когда кто-то подписывается, скажем, 15 января, а затем снова получает счет 1 февраля.

Это то, что произойдет, если я проверю последний платеж с ИНТЕРВАЛОМ 1 МЕСЯЦ? Или это будет то же самое, что ИНТЕРВАЛ 30 ДНЕЙ, и только повторно обработать платеж 15 февраля, чего я и хочу?

Комментарии:

1. Это довольно легко проверить самостоятельно…

2. Серьезно. Это занимает меньше времени, чем задавать вопрос.

3. Я согласен, что вы должны быть в состоянии проверить это самостоятельно. Однако при этом обязательно попробуйте разные месяцы, чтобы вы могли видеть, как обрабатываются месяцы с разным количеством дней. Возможно, вы также захотите посмотреть, как 1 MONTH , например, будет работать вычитание интервала с 31 марта. Я надеюсь, что это более полезно, чем просто быть синонимом 30 DAY

Ответ №1:

В соответствии с MYSQL

Если вы добавляете MONTH, YEAR_MONTH или YEAR и результирующая дата имеет день, который больше максимального дня для нового месяца, день корректируется на максимальное количество дней в новом месяце:

mysql> ВЫБЕРИТЕ DATE_ADD (‘2009-01-30’, ИНТЕРВАЛ 1 МЕСЯЦ); -> ‘2009-02-28’ Арифметические операции с датами требуют полных дат и не работают с неполными датами, такими как ‘2006-07-00’ или сильно искаженными датами:

Таким образом, если вы используете встроенную функцию 1 месяц, вам не нужно беспокоиться, когда последний день месяца. MYSQL делает всю работу за вас.

Комментарии:

1. как насчет в случае data_sub, ВЫБЕРИТЕ DATE_SUB(‘2009-02-28’, ИНТЕРВАЛ 1 МЕСЯЦ); -> ‘2009-01-28’ …. наоборот, не правильно

2. @Zigri2612 это не было отношением один на один… результатом будет ‘2009-01-28’