2012-01-13 12 views
0

私は与えられた時間間隔の間の和を見つけたいと思い、この表に選択日付の交差点

+------+--------+-------------------------+ 
| id | amount | start_date | end_date | 
| 10 |  10 | 2012-01-15 | 2012-01-20 | 
| 10 |  12 | 2012-01-14 | 2012-01-15 | 
| 10 |  22 | 2012-01-15 | 2012-01-16 | 
+------+--------+-------------------------+ 

を持っています。

例:

開始日時:2012-01-13
終了日時:2012-01-18
和(量)= 44

開始日:2012-01- 18
終了日時:2012-01-21
和(量)= 10

1つのクエリとすることが可能ですか?
それはまったく可能ですか?後ろ

EDIT
ロジックはintevarls(いずれかを与えられ、テーブル内の)オーバーラップする場合、私は行を取得する必要があることです。

@StartDate@EndDateはあなたが間を確認したい日付です
+0

あなたが信じるなら何でも可能です!実際、ここでもっと詳しく説明してください。リクエストは_include_setと同じように_sounds_ですが、例は別の方法で表示されます。 –

+0

誰が下降し、なぜですか?理由についてのコメントなしに、あなたは何を達成すると思いますか? – MatBailie

+0

@Dems upvoteに感謝します。P – tampe125

答えて

3
SELECT SUM(amount) 
FROM TableX 
WHERE start_date <= @EndDate 
    AND @StartDate <= end_date 

。テーブルFROM

+1

+1:これは間違いありません。しかし、私はそれに余分なものを追加したいと思います。 'start_date、end_date'にインデックスがある場合、実際には' start_date'部分の恩恵しか受けません。そして、あなたは 'start_date <= @endDate'だけを指定しています。あなたのテーブルに存在する最長期間を知っているなら、 'AND start_date> = @startDate - (longestPeriod)'を追加することができます。大規模なデータセットでは、これはチェックされるレコードの数を大幅に減らすことができます。これにより、このタイプのスキーマで最大限の期間を実行してから、より長い期間を表す複数のレコードを持つようになりました。 – MatBailie

+0

私はすでにこのソリューションを試してみましたが、うまくいきませんでした。あなたはその理由を知っていますか?私は日付を引用するのを忘れてしまった!私は馬鹿だ... :) – tampe125

+0

@Dems:Nice。このような2つ(またはそれ以上)の範囲条件は、常に最適化するのが難しいです。私も 'AND(@ StartDate-longestPeriod)<= end_date'を追加すると助けになると思います。 –

0

SELECT SUM(量)はWHERE START_DATE> '2012-01-13' AND <をEND_DATE '2012-01-18'

0

確かに、あなたが行うことができます:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-18' 

はあなたを与えます34.あなたがやるだろうと44を取得したい場合:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-20' 

が、これは

0
SELECT SUM(`amount`) as TotalAmount 
FROM `tableName` 
WHERE (start_date >= '2012-01-13 00:00:00' 
      AND 
     end_date <= '2012-01-18 23:59:59') 
を役に立てば幸い