2016-11-30 14 views
0

値がstartdate,enddateTariffVariableNameという値とともに格納されたテーブルVariableValuesがあります。MySQLはタイムスライスの日付ギャップを見つける

別のテーブル変数もstartenddatename

EndDatesは排他的でありました:月february 2016ためのでtimesliceは、私は2つのチェック(私は2つのクエリを好む)

を実行したい2016-02-01 - 2016-03-01

だろう1:VariableValues内に隙間がない可能性があります

例:月4月はカバーされていないよう

VariableValue.Name = name1 
    startdate: 2016-02-01 - enddate: 2016-03-01 
    startdate: 2016-04-01 - enddate: 2016-12-01 

は==>エラーを与える必要があります。

2:変数の全期間は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

現在のコードが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; 

同じアプローチが間隔をチェックするために使用することができカバー:から各間隔の変数2つの人工間隔を追加し、VariableValuesからすべての重複区間を取る:Variable.StartDateを - Variable.StartDateとVariable.EndDate - Variable.EndDateを実行し、上記ギャップ検出器を実行します。

関連する問題