2

テーブルがあり、そのデータは次のようになります

startDate|endDate |price
=========+========+========  
1 dec    | 15 dec | 100  
16 dec   |31 dec  | 200  
1 jan    | 31 Jan | 300  
1 feb    | 10 feb | 30
15 feb   | 28 feb | 40
1 march  | 15 march | 50

料金は1日料金です。今、私は日付の間の価格を計算したいと思っています。その場合、価格は (100 * 10 日) になります。別の条件は、12 月 1 日から 1 月 15 日までの価格を計算すると、価格は ((100 * 15 日)+(200*15 日)+(300*15 日)) になります。もう 1 つの条件は、2 月 20 日から 3 月 5 日までの価格を計算すると、価格は (40*8 日 + 50*5) になります。データ料金から計算する方法。

4

3 に答える 3

0

最初に、任意のインターバル フィッティング クエリ日付を選択する必要があります。次に、各間隔の日数と間隔の価格を計算できます。あとは合計するだけです。

select 
 SUM(
  DATEDIFF(
   if( end_date > '2012-09-12', '2012-09-12', end_date ),
   if( start_date < '2012-09-02', '2012-09-02', start_date )
  ) * price
 )
from prices where start_date < '2012-09-12' and end_date > '2012-09-02'

SqlFiddle - http://sqlfiddle.com/#!2/abc0b/11/0

これは INT の時間の例です

select 
 SUM(
  DATEDIFF(
   if( end_date > '2012-09-12', '2012-09-12', end_date ),
   if( start_date < '2012-09-02', '2012-09-02', start_date )
  ) * price
 )
from (
 select 
  FROM_UNIXTIME( start_date, '%Y-%m-%d' ) as start_date,
  FROM_UNIXTIME( end_date, '%Y-%m-%d' ) as end_date,
  price
 from prices where start_date <  UNIX_TIMESTAMP( '2012-09-12' ) and end_date >  UNIX_TIMESTAMP( '2012-09-02' )
) as l

編集:修正された例、フィドルに感謝編集2:Unixタイムスタンプの例

于 2012-11-26T09:19:03.237 に答える
0

おそらく、次のことを試すことができます。

クエリ:

select price*10
  from prices
  where '2012-09-02' between start_date
  and start_date + interval 10 day

結果:

PRICE*10
1010

参照: * SQLFIDDLE

現在、間隔は静的な値にすぎません。これを動的な値としてクエリに渡すことができます。複数の日付範囲を含めるために必要なのは、異なる開始日の間に異なる間隔を渡して価格を把握することだけです。明確な場合、またはさらに説明が必要な場合はお知らせください:)

于 2012-11-26T09:23:19.707 に答える
-1

編集:私は答えを保持しましたが、もはやそれに同意しません。理由についてはコメントを参照してください。

考えられる答えの 1 つは、それが最善だとは思いませんが (他の回答を参照)、データを非正規化することです。

day    | price
=======+======
1 dec  | 100
2 dec  | 100
3 dec  | 100
4 dec  | 100
...
15 dec | 100
16 dec | 200
17 dec | 200
...

次に、あなたの答えは次のように簡単です。

select sum(price) from mytable where day > '1 dec' and day < '15 jan'

これにより、データの操作がより簡単になり、より直感的になる可能性がありますが、いくつかの欠点があります。

  • 遅くなる可能性があります。範囲が長時間同じままである場合、多数の行に対するクエリは 1 行よりも遅くなります。
  • 更新が遅くなる場合があります (同じ理由で)。
于 2012-11-26T09:16:33.627 に答える