1

年に関係なく、特定の日付が範囲内にあるかどうかを MySQL で確認する最も簡単な方法は何でしょうか。

データベーステーブルには 2 つのDATEフィールドがstartあります。finishYYYY-mm-dd

任意の年の 11 月 1 日から 3 月 1 日までの間であればstart = 2013-11-01finish = 2014-03-01何でも受け入れられるべきです。

有効な日付: 2020-01-01 1980-02-28

無効な日付: 2013-10-30 1968-07-30

4

4 に答える 4

2

ほぼ確実にそれを行うためのよりクリーンな方法がありますが、これはうまくいくはずです:

((DAYOFYEAR(finish_date) > DAYOFYEAR(start_date) 
    AND (DAYOFYEAR(@date) >= DAYOFYEAR(start_date) 
     AND DAYOFYEAR(@date) <= DAYOFYEAR(finish_date)))
OR (DAYOFYEAR(finish_date) <= DAYOFYEAR(start_date) 
    AND (DAYOFYEAR(@date) >= DAYOFYEAR(start_date) 
      OR DAYOFYEAR(@date) <= DAYOFYEAR(finish_date))))

開始日が 2012 年 10 月で終了日が 2020 年 11 月の場合、10 月から 11 月の範囲のすべての日付が返されます。実際に、範囲が 1 年を超える場合 (したがって、その年のすべての日付をカバーする場合) にすべての日付を返したい場合は、次のように追加できます。

OR DATEDIFF(Day, start_date, finish_date) > 356 

最終ブラケット前。

于 2013-11-08T10:03:53.413 に答える
0
SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND month(t.finish) < 3 

3 月 1 日が必要な場合は、次のようになります。

SELECT * FROM tableWithDates t WHERE month(t.start) >= 11 AND (month(t.finish) < 3 OR month(finish) <= 3 AND day(finish)<=1)

これを実行するデータのサイズによって異なります。MySQL は計算列のインデックスを使用できないため、パフォーマンスの問題が発生する可能性があります。これに遭遇した場合は、月および/または日を別々の列に吐き出すことをお勧めします。

編集:「2008-02-29」として1つのパラメーター入力が与えられた場合

SELECT * FROM tableWithDates t 
WHERE 
 month(t.start) >= month('2008-02-29') AND day(t.start) >= day('2008-02-29')
AND month(t.finish) <= month('2008-02-29') AND day(t.finish) <= day('2008-02-29')
于 2013-11-08T10:20:08.963 に答える