4

私は常に自分の日付をUNIXタイムスタンプとしてデータベースに保存しています。これで、2つの日付があります。Webサイトに表示したいいくつかの画像の開始日と終了日です。画像は「開始日」に表示され、「終了日」に達すると消えます。

現時点では、この単純なクエリを使用しています。

SELECT name, image, link
FROM exclusive
WHERE CURDATE( ) >= from_unixtime( start_date, '%d-%m-%Y' )  
AND CURDATE( ) <= from_unixtime( end_date, '%d-%m-%Y' )
AND category = 'movies'
LIMIT 0 , 5

ただし、データ範囲内に2つのフィールドがありますが、これは毎回空の結果を返します。

私はここで何が間違っているのですか?

前もって感謝します。

4

3 に答える 3

3

これを試してみてください。開始日と終了日にある可能性のある任意のインデックスを実際に使用できるという追加の利点があります。

SELECT name, image, link
FROM exclusive
WHERE UNIX_TIMESTAMP() BETWEEN start_date AND end_date
AND category = 'movies'
LIMIT 0 , 5
于 2012-12-19T18:45:04.843 に答える
3

問題は、タイムスタンプではなく文字列タイプとして比較を行っていることです。したがって、形式が重要です。yyyy-mm-ddに変更すると、機能します(最も重要な部分である年が左側にあるため)。

しかし、はるかに優れており、インデックスを使用して最適化できるのは、タイムスタンプとして比較することです。

WHERE start_date <= unix_timestamp(curdate())
    AND end_date >= unit_timestamp(curdate())

または、一部のSQLエンジンでは、BETWEEN演算子を使用します。

WHERE unix_timestamp(curdate()) BETWEEN start_date AND end_date
于 2012-12-19T18:46:04.110 に答える
3

フォーマットする代わりに、DATE()関数を使用してタイムスタンプの時間部分を削除します。

SELECT name, image, link
FROM exclusive
WHERE 
    CURDATE( ) BETWEEN DATE(from_unixtime( start_date ) )
    AND DATE(from_unixtime( end_date ) )
    AND category = 'movies'
LIMIT 0 , 5
于 2012-12-19T18:48:51.757 に答える