我有一个表VariableValues,其中一个值与startdate
,enddate
和TariffVariableName
一起存储。
另一个表变量还有start
,enddate
和name
结束日期是独占的:因此timeslice
月february 2016
为2016-02-01 - 2016-03-01
我想执行两次检查(我更喜欢两个查询)
一:VariableValues
中可能没有空白示例:
VariableValue.Name = name1
startdate: 2016-02-01 - enddate: 2016-03-01
startdate: 2016-04-01 - enddate: 2016-12-01
==>应该给出一个错误,因为四月没有涵盖。
二: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
==>应该给出一个错误,因为11月和12月没有涵盖值
任何帮助?
答案 0 :(得分:1)
差距探测器:
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;
可以使用相同的方法检查区间覆盖:对于来自Variable的每个区间,从VariableValues获取所有重叠区间,添加两个人工区间:Variable.StartDate - Variable.StartDate和Variable.EndDate - Variable.EndDate,并运行上面的Gaps检测器。