2012-01-10 6 views
1

私はすばやく問題を抱えています。の間で選択するとMySQLでは動作しませんか?

SELECT `deals`.* 
    FROM `deals` 
    WHERE 
    `is_featured` = 1 AND 
    `status` = 'active' AND 
    CURDATE() BETWEEN start_date AND DATE_ADD(end_date, INTERVAL 1 DAY) 
    ORDER BY `end_date` DESC 
    LIMIT 1 

これは正しいですか?

は「2012-01-11 00:00:00」、end_dateは「2012-01-11 23:59:59」です。

を、私は、現在の日時の間とis_featuredが1であるとstatusは「アクティブ」であればあるdealofferを表示したい:

これは私が表示したいものです。

CURDATE()は、時間ではなく日付のみを表示しますが、これは問題ですか?MySqlで現在の日時はどのように取得できますか?)

これは1つの取引のみを選択し、この取引は現在の日時から最も近い終了日を持つ取引である必要があります。ここで

+0

将来の予定はありますか?そうでない場合は、代わりに最大日付のものを見つけることができますか?または、将来の日付がある場合は、現在の日付よりも小さい最大日付を探すことができますか? – DOK

+0

それはうまくいくはずです。どのようなエラーが出ますか?ところで、NOW()は現在の日時を返します。 –

+0

どのデータ型がstart_dateとend_dateですか? –

答えて

2

は、あなたが取得するために、CURTIME()関数を使用することができ、あなたの元のクエリ

SELECT `deals`.* FROM `deals` 
WHERE `is_featured` = 1 
AND `status` = 'active' 
AND CURDATE() BETWEEN start_date AND DATE_ADD(end_date, INTERVAL 1 DAY) 
ORDER BY `end_date` DESC 
LIMIT 1; 

この

SELECT `deals`.* FROM `deals` 
WHERE `is_featured` = 1 
AND `status` = 'active' 
AND start_date >= (CURDATE() + INTERVAL 0 SECOND) 
AND start_date <= (end_date + INTERVAL 1 DAY) 
ORDER BY `end_date` DESC 
LIMIT 1; 

でBETWEENを交換し、このインデックスに

ALTER TABLE deals ADD INDEX (is_featured,status,start_date,end_date); 
0

を追加することです現在の時刻。

1

now()を使用して日付と時刻を取得します。

関連する問題