0

次のテーブル SEASONS には、各期間の予約価格を定義する期間があります。

ID, STARTDATE,  ENDDATE,    PRICE
 6, 2012-06-01, 2012-06-30, 20
 7, 2012-07-01, 2012-07-31, 35
 8, 2012-08-01, 2012-08-31, 30
 9, 2012-09-01, 2012-09-30, 25

この表は、料金設定期間 (料金設定期間の開始日と終了日、およびその特定の料金設定期間の各日の予約料金) を定義します。問題は、特定の予約期間のすべての日の予約の合計金額を返すクエリを作成する方法です。たとえば、2012-06-10 から 2012-08-20 までの期間の合計 (SUM) 予約価格を計算 (SELECT?) する方法は?

(もちろん、手動で簡単に計算できます = 21(6 月の日数)x20 + 31(7 月の日数)x35 + 20(8 月の日数)x30 = 2105) 合計予約価格を返す SELECT ステートメントはどのようになりますか?

4

2 に答える 2

1

使用DATEDIFF機能:

SELECT SUM(DATEDIFF(ENDDATE,STARTDATE) * PRICE) AS TOTAL_PRICE
    FROM SEASONS
    WHERE STARTDATE <= '2012-06-10' AND ENDDATE >= '2012-08-20'

また、予約の開始/終了のチェッ​​クを追加することもできます。これは、予約が途中であり、すべての期間を含める必要がないためです...

それで:

SET @START='2012-06-10';
SET @END='2012-08-20';
SELECT SUM(
  DATEDIFF(
    IF(YEAR(ENDDATE)=YEAR(@END) AND MONTH(ENDDATE)=MONTH(@END), @END, ENDDATE),
    IF(YEAR(STARTDATE)=YEAR(@START) AND MONTH(STARTDATE)=MONTH(@START), @START, STARTDATE)
     )
  ) AS TOTAL_SUM
FROM SEASONS
WHERE STARTDATE <= @END AND ENDDATE >= @START
于 2012-06-23T23:20:05.450 に答える
0

他の読者のためだけに、前の回答の結果として、最終的なクエリは次のようになります。

SET @START='2012-06-10';
SET @END='2012-08-20';
SELECT SUM(
 (DATEDIFF(
   IF(enddate>=@END,@END,enddate),      
   IF(startdate<=@START,@START,startdate)
 )+1)*price ) AS TOTAL_SUM
FROM seasons WHERE startdate<=@END AND enddate>=@START

開始日と終了日の両方が価格設定範囲に含まれるようにするには、日付の差に1を追加する必要があります。もちろん、価格を掛ける必要があります。

@ponchaありがとうございます。予約期間のすべての日付をループして複数の価格を取得し、それらを解決策として合計する手順をすでに作成しましたが、より簡単で効率的な解決策があるはずです。

于 2012-06-24T18:52:32.170 に答える