要执行日期算术,您应该将年月字面量转换为月份的第一个日期字面量,如下所示。我还让您选择按月或按天与继任者不同。以及在目标表中包含字符串或 DATE 类型的选择。
CREATE TABLE output AS
WITH
-- your input
input (col) AS (
SELECT '04/2013'
UNION ALL SELECT '07/2013'
UNION ALL SELECT '12/2013'
UNION ALL SELECT '07/2014'
UNION ALL SELECT '12/2014'
UNION ALL SELECT '07/2015'
UNION ALL SELECT '12/2015'
UNION ALL SELECT '07/2016'
UNION ALL SELECT '12/2016'
UNION ALL SELECT '07/2017'
UNION ALL SELECT '12/2017'
UNION ALL SELECT '07/2018'
UNION ALL SELECT '12/2018'
UNION ALL SELECT '07/2019'
UNION ALL SELECT '12/2019'
UNION ALL SELECT '07/2020'
UNION ALL SELECT '08/2020'
)
,
-- need to convert to DATE type to sort properly
todate AS (
SELECT
col
, TO_DATE(col,'MM/YYYY') AS dt
FROM input
)
-- remove the cols you don't need, but it will
-- be handy to have them all as DATES
-- I'll also add a more convenient col, ony 1 day before the next
,
one_row_too_many AS (
SELECT
col AS start_string
, dt AS start_dt
, LEAD(dt) OVER(ORDER BY dt) - 1 AS end_dt_by_day
, TO_CHAR(LEAD(dt) OVER(ORDER BY dt) - 1,'MM/YYYY') AS end_string_by_day
, CAST(LEAD(dt) OVER(ORDER BY dt) - INTERVAL '1 MONTH' AS DATE) AS end_dt_by_month
FROM todate
)
SELECT
*
FROM
one_row_too_many
WHERE end_dt_by_day IS NOT NULL;
-- CONTROL QUERY
SELECT * FROM output;
-- out Time: First fetch (0 rows): 51.357 ms. All rows formatted: 51.364 ms
-- out start_string | start_dt | end_dt_by_day | end_string_by_day | end_dt_by_month
-- out --------------+------------+---------------+-------------------+-----------------
-- out 04/2013 | 2013-04-01 | 2013-06-30 | 06/2013 | 2013-06-01
-- out 07/2013 | 2013-07-01 | 2013-11-30 | 11/2013 | 2013-11-01
-- out 07/2014 | 2014-07-01 | 2014-11-30 | 11/2014 | 2014-11-01
-- out 07/2015 | 2015-07-01 | 2015-11-30 | 11/2015 | 2015-11-01
-- out 07/2016 | 2016-07-01 | 2016-11-30 | 11/2016 | 2016-11-01
-- out 07/2017 | 2017-07-01 | 2017-11-30 | 11/2017 | 2017-11-01
-- out 07/2018 | 2018-07-01 | 2018-11-30 | 11/2018 | 2018-11-01
-- out 07/2019 | 2019-07-01 | 2019-11-30 | 11/2019 | 2019-11-01
-- out 07/2020 | 2020-07-01 | 2020-07-31 | 07/2020 | 2020-07-02
-- out 12/2013 | 2013-12-01 | 2014-06-30 | 06/2014 | 2014-06-01
-- out 12/2014 | 2014-12-01 | 2015-06-30 | 06/2015 | 2015-06-01
-- out 12/2015 | 2015-12-01 | 2016-06-30 | 06/2016 | 2016-06-01
-- out 12/2016 | 2016-12-01 | 2017-06-30 | 06/2017 | 2017-06-01
-- out 12/2017 | 2017-12-01 | 2018-06-30 | 06/2018 | 2018-06-01
-- out 12/2018 | 2018-12-01 | 2019-06-30 | 06/2019 | 2019-06-01
-- out 12/2019 | 2019-12-01 | 2020-06-30 | 06/2020 | 2020-06-01