0

以下のシナリオの解決策を見つける際に問題に直面しています。次のstart_dateとend_dateを持つ製品の3つのレコードがあります。

Case:1
record1: 03-10-2012 and 30-10-2012
record2: 03-10-2012 and 10-10-2012
record3: 11-10-2012 and 20-10-2012

Case:2
record1: 03-10-2012 and 30-10-2012
record2: 11-10-2012 and 20-10-2012
record3: 21-10-2012 and 30-10-2012

Case:3
record1: 03-10-2012 and 30-10-2012
record2: 03-10-2012 and 10-10-2012
record3: 21-10-2012 and 30-10-2012

上記のすべての場合で、日付が欠落している4番目のレコードを作成する必要があり(たとえば、ケース1の場合、21日から30日までのレコードが必要です)、レコードがない場合は不要になったrecord1を削除したいと思います。日付がありません。

すべてを一度に行う方法はありますか?caseコマンドを使って試してみましたが、うまくいきませんでした。

これは私が書いたものです。

select MIN(end_date) AS min_end_date, MIN(start_date) AS min_start_date, 
    CASE WHEN MIN(start_date) <= MIN(end_date) AND MIN(start_date) > DATE '#{start_date}' THEN DATE_SUB(MIN(start_date), INTERVAL 1 day)
        ELSE MIN(end_date)
        END AS min_date

前もって感謝します。

4

1 に答える 1

1

ええと...あなたは次のことができます:

remainders=(record1.start_date..record1.end_date).to_a - (record2.start_date..record2.end_date).to_a - (record3.start_date..record3.end_date).to_a

その後、安全性チェックを行うことができます-または、データを信頼している場合は、そうさせてください-

if (remainders.first..remainders.last).to_a == remainders
  record4.start_date = remainders.first
  record4.end_date = remainders.last
  record1.destroy
else
  raise
end
于 2012-09-17T11:19:46.163 に答える