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 дней».