2016-11-30 39 views
0

我有使价值与startdateenddateTariffVariableName存储在一起的表VariableValues。MySQL的发现日期差距

另一个表变量也有startenddatename

EndDates是独家:所以timeslice为一个月february 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 

==>应该给作为一个月十一月和十二月未覆盖价值观

错误

任何帮助?

+1

请向我们提供您迄今已尝试的代码。在目前的状态下,它看起来更像是一个功能要求,而不是一个编码问题。由于这不是免费的编码服务,因此我们需要了解您所尝试的内容以及您卡住的位置,然后我们可以从那里为您提供帮助。 –

+0

我目前的代码太长了630个字符。我正在用php代码尝试它,但我更喜欢下面提供的SQL解决方案! –

回答

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; 

同样的方法也可以用来检查间隔封面:用于从每个间隔可变采取从VariableValues所有重叠的间隔,添加两个人工间隔:Variable.StartDate - Variable.StartDate和Variable.EndDate - Variable.EndDate,并运行上面的间隙检测器。