2016-12-29 29 views
0

次の表があります。間隔の日付間のクエリ

enter image description here

私は私がパーセントで最初のレコードを取得するためにすべき2002年12月29日と2002年12月30日の間のパーセントが必要な場合は、たとえば、任意の日付と交差するレコードを取得しようとしています28.60、私はクエリを書くが、時々私はいくつかのレコードを取得するが、時には何も得られない。どんな助けも素晴らしいだろう。

は、ここでは、私はMySQLがサポートしていないと思うSQL overlapsオペレータ、探しているようですねクエリ

SELECT * 
FROM myTable 
WHERE ((fec_inicio < '2002-12-29' 
AND fec_fin  > '2002-12-29') 
OR (fec_inicio  < '2002-12-30' 
AND fec_fin  > '2002-12-30')) 
+0

BETWEEN演算子を使用してみましたか? –

+1

あなたが2002-12-29と2003-10-25を持っていれば何パーセント見たいですか?どのようにロジックが正しく見えないのか。あなたは、比較するべき日付を1つしか持たず、その日付の割合を得るべきではありませんか? – Stephen

+0

まだ苦労していますか? http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-queryを参照してください。 – Strawberry

答えて

0

です。 overlapsオペレータは

row_constructor overlaps row_constructor 

として定義され、行コンストラクタは、フォーム

Lsの左側は、を開始 左端を意味し、意味
(Ls, Le) OVERLAPS (Rs, Re) 

を持っています

overlaps演算子はdefiです。この表現と意味的に等価であることを条件とする。

(Ls > Rs and (Ls < Re or Le < Re)) or 
(Rs > Ls and (Rs < Le or Re < Le)) or 
(Ls = Rs and Le is not null and Re is not null) 

値を代用すると、次のようになります。 (テストされていません)

select * 
from myTable 
where ('2002-12-29' > fec_inicio and ('2002-12-29' < fec_fin or '2002-12-30' < fec_fin)) or 
     (fec_inicio > '2002-12-29' and (fec_inicio < '2002-12-30' or fec_fin < '2002-12-30')) or 
     ('2002-12-29' = fec_inicio and '2002-12-30' is not null and fec_fin is not null); 

私はこれらの置換が正しいことを望みます。 (そして希望がうまくスケールされないことを知っています)

複数の行に重なる範囲で何をする必要があるのか​​はあなたの質問からは分かりません。しかし、例えば、上のクエリから最小の日付を選択するだけで十分ですが、完全な行を取得するにはその日付のinner joinにする必要があります。

これまで述べてきたように、パーセンテージを選択するというあなたの論理は奇妙に見えます。考えてみましょう。

関連する問題