I have a table VariableValues in which a value is stored together with a startdate
,enddate
and TariffVariableName
.
Another table Variable also has start
, enddate
and name
EndDates are exclusive: so timeslice
for month february 2016
would be 2016-02-01 - 2016-03-01
I want to perform two checks (I prefer two queries)
One: There may be no gaps within the VariableValues
Example:
VariableValue.Name = name1
startdate: 2016-02-01 - enddate: 2016-03-01
startdate: 2016-04-01 - enddate: 2016-12-01
==> Should give an error as month April is not covered.
Two: The full period of the Variable should be covered by VariableValues
Variable.startdate: 2016-01-01 - enddate 2017-01-01
VariableValue.startdate 2016-01-01 - enddate 2016-06-01
VariableValue.startdate 2016-06-01 - enddate 2016-11-01
==> Should give an error as the month November and December is not covered by Values
Any help?
Gaps detector:
CREATE TABLE VariableValues (TariffVariableName CHAR(5), StartDate DATE, EndDate DATE);
INSERT INTO VariableValues (TariffVariableName, StartDate, EndDate)
VALUES ('name1', STR_TO_DATE('20160201', '%Y%m%d'), STR_TO_DATE('20160301', '%Y%m%d'));
INSERT INTO VariableValues (TariffVariableName, StartDate, EndDate)
VALUES ('name1', STR_TO_DATE('20160401', '%Y%m%d'), STR_TO_DATE('20161201', '%Y%m%d'));
SELECT *
FROM (
SELECT
next.TariffVariableName,
(
SELECT MAX(prev.EndDate)
FROM VariableValues prev
WHERE prev.TariffVariableName = next.TariffVariableName
AND prev.EndDate < next.StartDate
) AS StartDate,
next.StartDate As EndDate
FROM VariableValues next
WHERE NOT EXISTS (
SELECT '*'
FROM VariableValues overlap
WHERE overlap.TariffVariableName = next.TariffVariableName
AND overlap.EndDate >= next.StartDate
AND overlap.StartDate < next.StartDate
)
) gap
WHERE gap.StartDate IS NOT NULL
ORDER BY gap.TariffVariableName, gap.StartDate;
The same approach can be used to check interval Cover: for each interval from Variable take all overlapping intervals from VariableValues, add two artificial intervals: Variable.StartDate - Variable.StartDate and Variable.EndDate - Variable.EndDate, and run the above Gaps detector.