首先,您在接下来的两年中创建日期的时间序列,即EXCEPT
您的停电日期:
SELECT dt
FROM generate_series('2015-08-01'::date, '2017-08-01'::date, interval '1 day') AS s(dt)
EXCEPT
SELECT dt
FROM generate_series('2015-08-27'::date, '2015-09-03'::date, interval '1 day') as ex1(dt)
请注意,您可以根据EXCEPT
需要拥有尽可能多的子句。对于个别停电日(而不是范围),您可以使用VALUES
子句而不是SELECT
.
然后,您对该时间序列进行窗口化以生成可计费天数的行数:
SELECT row_number() OVER (ORDER BY dt) AS rn, dt
FROM (<query above>) x
然后,您选择要计费的日期:
SELECT dt
FROM (<query above>) y
WHERE rn % 30 = 1; -- billing on the first day of the period
(后一个查询遵循 Craig 的 30 天计费建议)
产量:
SELECT dt
FROM (
SELECT row_number() OVER (ORDER BY dt) AS rn, dt
FROM (
SELECT dt
FROM generate_series('2015-08-01'::date, '2017-08-01'::date, interval '1 day') AS s(dt)
EXCEPT
SELECT dt
FROM generate_series('2015-08-27'::date, '2015-09-03'::date, interval '1 day') as ex1(dt)
) x
) y
WHERE rn % 30 = 1;