MySQL在时间片

时间:2016-11-30 16:25:49

标签: php mysql

我有一个表VariableValues,其中一个值与startdateenddateTariffVariableName一起存储。

另一个表变量还有startenddatename

结束日期是独占的:因此timeslicefebruary 20162016-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月没有涵盖值

任何帮助?

1 个答案:

答案 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检测器。