2012-02-15 7 views
2
id start_date end_date   
1 2012-02-05 2012-03-10  
2 2012-03-05 2012-03-25  
3 2012-03-19 2012-03-27  
4 2012-04-01 2012-04-20 

Table Name: bulbs 

この表には、指定された期間中のライトである電球に関する情報が含まれています。 2つの日付を選択すると、その日付範囲の電球IDを現在取得したいと考えています。例えば'2012-02-10'と '2012-03-20'の日付では、これはids-1,2と3を返すはずです。どうやってそれを行うのかわかりません。助けてください。指定された期間のID取得

+0

を意味するか '2012-02-10'''を' 2012-03- 20''? 2月10日から20日は私の理解からid 1だけ与えるべきですか?あなたの最終日は含まれていますか排他的ですか? *( '2012-03-10'''''''''''''''''''''122-03-20'''d id 2と3と一緒にid 1を返すのですか?)* – MatBailie

+0

ええ。私の間違い。私は私の質問を編集しました。 –

答えて

2

は、私は私がこの権利を理解すれば、それはSQLである必要があり、その場合には、単にID 1 を与える必要があり、2012年2月10日および2012年2月20日には、IDSにあなたに1,2,3を与えるだろうか取得いけません

select id from bulbs where 
end_date >= '2012-02-10' and 
start_date <= '2012-02-20' 
+0

ありがとうございました。できます。 :D –

0
select id 
from bulbs 
where '2012-02-10' <= start_date 
and ('2012-02-20' between start_date and end_date) 
0
SELECT 
    * 
FROM 
    bulbs 
WHERE 
    start_date <= '2012-02-20' 
    AND end_date >= '2012-02-10' 

このタイプのクエリは、しかし、大量のデータを超える非常に遅いです。

これは、(start_date、end_date)のインデックスが単なる(start_date)のインデックスを助けないためです。

パフォーマンスを向上させ、開始日の上限と下限の両方を与える1つの方法です。これは、start_dateとend_dateの間の最大日数を知っている場合に実行できます。

例えば、彼らはアパート60日以上は決してありません、場合、あなたはこれを行うことができます...あなたは `

SELECT 
    * 
FROM 
    bulbs 
WHERE 
     start_date <= '2012-02-20' 
    AND start_date >= '2012-02-10' - 60 
    AND end_date >= '2012-02-10' 
+0

これはさらに優れています。どうもありがとう。 –

関連する問題