как получить первый и последний день каждого месяца за последние 4 года с текущей даты в IBM DB2? - PullRequest
0 голосов
/ 28 мая 2020

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

WITH tempdateseries (StartDate,EndDate) AS (
SELECT
    DATE(1) + (YEAR(CURRENT DATE)-5) YEARS AS StartDate,
    LAST_DAY(CURRENT DATE - 4 YEARS) AS EndDate
FROM
    sysibm.sysdummy1
UNION ALL
SELECT
    StartDate + 1 MONTH,
    EndDate
FROM
    tempdateseries
WHERE
    StartDate < LAST_DAY(CURRENT DATE - 1 MONTHS)
    AND EndDate < LAST_DAY(CURRENT DATE - 1 MONTHS)) 
    SELECT
    *
FROM
    tempdateseries

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Попробуйте следующее:

WITH T (STARTDATE) AS 
(
VALUES CURRENT DATE - (DAY(CURRENT DATE) - 1) DAY
  UNION ALL
SELECT STARTDATE - 1 MONTH
FROM T
WHERE CURRENT DATE < STARTDATE - 1 MONTH + 4 YEAR
)
SELECT STARTDATE, STARTDATE + 1 MONTH - 1 DAY ENDDATE
FROM T
ORDER BY STARTDATE DESC
FETCH FIRST 5 ROWS ONLY;

Результат:

|STARTDATE |ENDDATE   |
|----------|----------|
|2020-05-01|2020-05-31|
|2020-04-01|2020-04-30|
|2020-03-01|2020-03-31|
|2020-02-01|2020-02-29|
|2020-01-01|2020-01-31|
0 голосов
/ 30 мая 2020

Хороший, @Mark Barinstein ...

Прокатился в вашем подходе, но вмешался в две новые полезные функции из недавних выпусков ..

DATE_TRUN C и LAST_DAY

WITH T (STARTDATE) AS  
( 
VALUES DATE(DATE_TRUNC('MONTH', CURRENT DATE ) )
  UNION ALL 
SELECT STARTDATE - 1 MONTH 
FROM T 
WHERE CURRENT DATE < STARTDATE - 1 MONTH + 4 YEAR 
) 
SELECT STARTDATE, LAST_DAY(STARTDATE) ENDDATE 
FROM T 
ORDER BY STARTDATE DESC 
FETCH FIRST 5 ROWS ONLY
...