79 lines
1.5 KiB
SQL
79 lines
1.5 KiB
SQL
WITH anchor AS (
|
|
SELECT
|
|
'2023-12-17' :: date AS anchor_sunday
|
|
),
|
|
series AS (
|
|
SELECT
|
|
(gs.gs) :: date AS period_start,
|
|
((gs.gs + '13 days' :: INTERVAL)) :: date AS period_end,
|
|
((gs.gs + '18 days' :: INTERVAL)) :: date AS payday
|
|
FROM
|
|
generate_series(
|
|
(
|
|
(
|
|
SELECT
|
|
anchor.anchor_sunday
|
|
FROM
|
|
anchor
|
|
)
|
|
) :: timestamp WITH time zone,
|
|
(((CURRENT_DATE + '1 mon' :: INTERVAL)) :: date) :: timestamp WITH time zone,
|
|
'14 days' :: INTERVAL
|
|
) gs(gs)
|
|
),
|
|
numbered AS (
|
|
SELECT
|
|
series.period_start,
|
|
series.period_end,
|
|
series.payday,
|
|
(
|
|
EXTRACT(
|
|
year
|
|
FROM
|
|
series.payday
|
|
)
|
|
) :: integer AS pay_year,
|
|
row_number() OVER (
|
|
PARTITION BY (
|
|
EXTRACT(
|
|
year
|
|
FROM
|
|
series.payday
|
|
)
|
|
)
|
|
ORDER BY
|
|
series.payday
|
|
) AS pay_period_no
|
|
FROM
|
|
series
|
|
)
|
|
SELECT
|
|
pay_year,
|
|
pay_period_no,
|
|
period_start,
|
|
period_end,
|
|
payday,
|
|
(
|
|
(
|
|
to_char(
|
|
(period_start) :: timestamp WITH time zone,
|
|
'YYYY-MM-DD' :: text
|
|
) || '->' :: text
|
|
) || to_char(
|
|
(period_end) :: timestamp WITH time zone,
|
|
'YYYY-MM-DD' :: text
|
|
)
|
|
) AS label
|
|
FROM
|
|
numbered
|
|
WHERE
|
|
(
|
|
(
|
|
payday >= ((CURRENT_DATE - '6 mons' :: INTERVAL)) :: date
|
|
)
|
|
AND (
|
|
payday <= ((CURRENT_DATE + '1 mon' :: INTERVAL)) :: date
|
|
)
|
|
)
|
|
ORDER BY
|
|
period_start; |