Какой день наступает через месяц после 31 января? Какой день в одном месяце до 31 марта? Я проверил это с помощью различных РБД.

31/1, когда вы читаете это сообщение в таком виде, можете ли вы сразу вспомнить, какой сегодня день?

«Срок действия истекает через месяц после даты регистрации».

А как насчет следующего сообщения 31/3?

«Уведомление будет дано за один месяц».

Я изучил этот вопрос, но не смог найти никаких юридических положений или международных правил.

Поэтому я решил исследовать это в различных РЦБ.

Я попробовал с:

  • MySQL
  • PostgreSQL
  • SQL Server
  • Oracle .

Во всех базах данных результат был одинаковым.

Результат

Содержание Результат
1 месяц спустя 28/1 28/2
1 месяц после 29/1 28/2
1 месяц после 30/1 28/2
1 месяц после 31/1 28/2
1 месяц до 28/3 28/2
1 месяц до 29/3 28/2
1 месяц до 30/3 28/2
1 месяц до 31/3 28/2
1 месяц после 28/1 (високосный год) 28/2
1 месяц после 29/1(високосный год) 29/2
1 месяц после 30/1(високосный год) 29/2
1 месяц после 31/1(високосный год) 29/2
1 месяц до 28/3(високосный год) 28/2
1 месяц до 29/3(високосный год) 29/2
1 месяц до 30/3(високосный год) 29/2
1 месяц до 31/3(високосный год) 29/2

SQL-запрос

MySQL

версия:5.7

SELECT
    DATE_ADD(CAST('2018/01/28' AS DATE), INTERVAL 1 MONTH) AS "1 month after 28/1"
   ,DATE_ADD(CAST('2018/01/29' AS DATE), INTERVAL 1 MONTH) AS "1 month after 29/1"
   ,DATE_ADD(CAST('2018/01/30' AS DATE), INTERVAL 1 MONTH) AS "1 month after 30/1"
   ,DATE_ADD(CAST('2018/01/31' AS DATE), INTERVAL 1 MONTH) AS "1 month after 31/1"

   ,DATE_ADD(CAST('2018/03/28' AS DATE), INTERVAL -1 MONTH) AS "1 month before 28/3"
   ,DATE_ADD(CAST('2018/03/29' AS DATE), INTERVAL -1 MONTH) AS "1 month before 29/3"
   ,DATE_ADD(CAST('2018/03/30' AS DATE), INTERVAL -1 MONTH) AS "1 month before 30/3"
   ,DATE_ADD(CAST('2018/03/31' AS DATE), INTERVAL -1 MONTH) AS "1 month before 31/3"

   ,DATE_ADD(CAST('2020/01/28' AS DATE), INTERVAL 1 MONTH) AS "1 month after 28/1(leap year)"
   ,DATE_ADD(CAST('2020/01/29' AS DATE), INTERVAL 1 MONTH) AS "1 month after 29/1(leap year)"
   ,DATE_ADD(CAST('2020/01/30' AS DATE), INTERVAL 1 MONTH) AS "1 month after 30/1(leap year)"
   ,DATE_ADD(CAST('2020/01/31' AS DATE), INTERVAL 1 MONTH) AS "1 month after 31/1(leap year)"

   ,DATE_ADD(CAST('2020/03/28' AS DATE), INTERVAL -1 MONTH) AS "1 month before 28/3(leap year)"
   ,DATE_ADD(CAST('2020/03/29' AS DATE), INTERVAL -1 MONTH) AS "1 month before 29/3(leap year)"
   ,DATE_ADD(CAST('2020/03/30' AS DATE), INTERVAL -1 MONTH) AS "1 month before 30/3(leap year)"
   ,DATE_ADD(CAST('2020/03/31' AS DATE), INTERVAL -1 MONTH) AS "1 month before 31/3(leap year)"
Вход в полноэкранный режим Выход из полноэкранного режима

PostgreSQL

ver:9.6

SELECT
    CAST('2018/01/28' AS DATE) + interval '1 months' AS "1 month after 28/1"
   ,CAST('2018/01/29' AS DATE) + interval '1 months' AS "1 month after 29/1"
   ,CAST('2018/01/30' AS DATE) + interval '1 months' AS "1 month after 30/1"
   ,CAST('2018/01/31' AS DATE) + interval '1 months' AS "1 month after 31/1"

   ,CAST('2018/03/28' AS DATE) + interval '-1 months' AS "1 month before 28/3"
   ,CAST('2018/03/29' AS DATE) + interval '-1 months' AS "1 month before 29/3"
   ,CAST('2018/03/30' AS DATE) + interval '-1 months' AS "1 month before 30/3"
   ,CAST('2018/03/31' AS DATE) + interval '-1 months' AS "1 month before 31/3"

   ,CAST('2020/01/28' AS DATE) + interval '1 months' AS "1 month after 28/1(leap year)"
   ,CAST('2020/01/29' AS DATE) + interval '1 months' AS "1 month after 29/1(leap year)"
   ,CAST('2020/01/30' AS DATE) + interval '1 months' AS "1 month after 30/1(leap year)"
   ,CAST('2020/01/31' AS DATE) + interval '1 months' AS "1 month after 31/1(leap year)"

   ,CAST('2020/03/28' AS DATE) + interval '-1 months' AS "1 month before 28/3(leap year)"
   ,CAST('2020/03/29' AS DATE) + interval '-1 months' AS "1 month before 29/3(leap year)"
   ,CAST('2020/03/30' AS DATE) + interval '-1 months' AS "1 month before 30/3(leap year)"
   ,CAST('2020/03/31' AS DATE) + interval '-1 months' AS "1 month before 31/3(leap year)"
Войти в полноэкранный режим Выход из полноэкранного режима

SQL Server

ver:14.0

SELECT
    DATEADD(MONTH, 1, CAST('2018/01/28' AS DATE)) AS "1 month after 28/1"
   ,DATEADD(MONTH, 1, CAST('2018/01/29' AS DATE)) AS "1 month after 29/1"
   ,DATEADD(MONTH, 1, CAST('2018/01/30' AS DATE)) AS "1 month after 30/1"
   ,DATEADD(MONTH, 1, CAST('2018/01/31' AS DATE)) AS "1 month after 31/1"

   ,DATEADD(MONTH, -1, CAST('2018/03/28' AS DATE)) AS "1 month before 28/3"
   ,DATEADD(MONTH, -1, CAST('2018/03/29' AS DATE)) AS "1 month before 29/3"
   ,DATEADD(MONTH, -1, CAST('2018/03/30' AS DATE)) AS "1 month before 30/3"
   ,DATEADD(MONTH, -1, CAST('2018/03/31' AS DATE)) AS "1 month before 31/3"

   ,DATEADD(MONTH, 1, CAST('2020/01/28' AS DATE)) AS "1 month after 28/1(leap year)"
   ,DATEADD(MONTH, 1, CAST('2020/01/29' AS DATE)) AS "1 month after 29/1(leap year)"
   ,DATEADD(MONTH, 1, CAST('2020/01/30' AS DATE)) AS "1 month after 30/1(leap year)"
   ,DATEADD(MONTH, 1, CAST('2020/01/31' AS DATE)) AS "1 month after 31/1(leap year)"

   ,DATEADD(MONTH, -1, CAST('2020/03/28' AS DATE)) AS "1 month before 28/3(leap year)"
   ,DATEADD(MONTH, -1, CAST('2020/03/29' AS DATE)) AS "1 month before 29/3(leap year)"
   ,DATEADD(MONTH, -1, CAST('2020/03/30' AS DATE)) AS "1 month before 30/3(leap year)"
   ,DATEADD(MONTH, -1, CAST('2020/03/31' AS DATE)) AS "1 month before 31/3(leap year)"
Войти в полноэкранный режим Выход из полноэкранного режима

Oracle

ver:11g

SELECT
    ADD_MONTHS(TO_DATE('2018/01/28'), 1) AS "1 month after 28/1"
   ,ADD_MONTHS(TO_DATE('2018/01/29'), 1) AS "1 month after 29/1"
   ,ADD_MONTHS(TO_DATE('2018/01/30'), 1) AS "1 month after 30/1"
   ,ADD_MONTHS(TO_DATE('2018/01/31'), 1) AS "1 month after 31/1"

   ,ADD_MONTHS(TO_DATE('2018/03/31'), -1) AS "1 month before 28/3"
   ,ADD_MONTHS(TO_DATE('2018/03/31'), -1) AS "1 month before 29/3"
   ,ADD_MONTHS(TO_DATE('2018/03/31'), -1) AS "1 month before 30/3"
   ,ADD_MONTHS(TO_DATE('2018/03/31'), -1) AS "1 month before 31/3"

   ,ADD_MONTHS(TO_DATE('2020/01/28'), 1) AS "1 month after 28/1(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/01/29'), 1) AS "1 month after 29/1(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/01/30'), 1) AS "1 month after 30/1(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/01/31'), 1) AS "1 month after 31/1(leap year)"

   ,ADD_MONTHS(TO_DATE('2020/03/31'), -1) AS "1 month before 28/3(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/03/31'), -1) AS "1 month before 29/3(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/03/31'), -1) AS "1 month before 30/3(leap year)"
   ,ADD_MONTHS(TO_DATE('2020/03/31'), -1) AS "1 month before 31/3(leap year)"
FROM
    DUAL
Войти в полноэкранный режим Выход из полноэкранного режима

Дополнительно

Если вы хотите сообщить дату истечения срока действия, возможно, лучше использовать дни вместо месяца, например, «Срок хранения данных составляет 90 дней».

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *