Есть ли в SQL способ выбрать все доступные дни в таблице с разницей в 30 дней? - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно выбрать все даты, начиная с текущей, с 30-дневным переходом между ними в прошлом. Например, сегодня 18 октября, поэтому мне нужно получить 18 сентября, 19 августа, 20 июля.

Я не могу просто написать функцию current_date - 30, current_date - 60, current_date - 90, потому что началоданные далеко.

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Для SQL Server вы можете использовать следующий код:

;WITH cte_Date30Days(n, d, dte) 
AS (
    SELECT 0, 0, current_timestamp as dte
    UNION ALL
    SELECT n+1, d - 30, dateadd(day, -30, dte)
    FROM    
        cte_Date30Days
    WHERE n < 7-1
)
SELECT  dte FROM cte_Date30Days;

Возвращается только 7 строк, но измените это значение в соответствии с вашими потребностями.

0 голосов
/ 18 октября 2019

Если вы используете Postgres, это довольно просто, используя generate_series()

select d::date as "date"
from generate_series(current_date, 
                     current_date - interval '1 year', 
                     interval '-1 month') as t(d)

, который возвращает «последние 12 месяцев», начиная с сегодняшнего дня.

Если сегодня 2019-10-18, возвращается:

date      
----------
2019-10-18
2019-09-18
2019-08-18
2019-07-18
2019-06-18
2019-05-18
2019-04-18
2019-03-18
2019-02-18
2019-01-18
2018-12-18
2018-11-18
2018-10-18

Если вы хотите 30-дневные интервалы (а не 1 месяц), используйте:

select d::date as date
from generate_series(current_date, 
                     current_date - interval '1 year', 
                     interval '-30 day') as t(d)
0 голосов
/ 18 октября 2019

Если вы используете Oracle, вы можете использовать следующий код -

WITH DATES(CUR_DATE, MON) AS (SELECT CURRENT_DATE CUR_DATE, 1 MON FROM DUAL
                                UNION ALL
                                SELECT D.CUR_DATE - 30, D.MON + 1 
                                FROM DATES D
                                WHERE TO_CHAR(D.CUR_DATE, 'MM') > 1
                                AND TO_CHAR(D.CUR_DATE, 'YY') = TO_CHAR(SYSDATE, 'YY'))
SELECT * FROM DATES

Здесь - это скрипка. Для других БД, пожалуйста, опубликуйте свой продукт СУБД.

...