2016-06-28 28 views
0

私はレコードのリストに結果をフィルタリングするために使用する2つのフィールド "cont_time_published"と "cont_date_published"を持っています。日付と時刻MySQLステートメント

select * 
from news 
WHERE cont_date_published < CURDATE() AND cont_time_published < CURTIME() 

私は、公開時間と公開日が過去のレコードのみを表示することを目指しています。今日の日付のレコードをフィルタリングしますが、時間はまだ未来です。

日付が今日で、時刻が未来のときは結果が間違っています。

cont_date_publishedは "DATE"専用フィールドであり、cont_time_publishedは "TIME"フィールドです。

+0

、ちょうど両方の列をDATETIME型のいずれかにマージし、すべての手間を省きます。 –

+0

ÁlvaroGonzález私のフレームワークでは日付と時刻のピッカーのために日付と時刻が1つのフィールドになることはできません。 – Cavemanharris

答えて

0
select * from news WHERE cont_date_published < CURDATE() 

これは、過去に公開されたレコードを取得するのに十分です。

1

あなたは(過去の時間にまたはの前に今日)過去に発表されたレコードを取得する必要がある場合にしようと、この

SELECT * 
FROM news 
WHERE (cont_date_published < CURDATE()) AND (cont_time_published < CURTIME()) 
ORDER BY id DESC; 
2

をお試しください:

SELECT * 
FROM news 
    WHERE cont_date_published < CURDATE() 
    OR (cont_date_published = CURDATE() AND cont_time_published < CURTIME()); 

申し訳ありません私のミス、OR

を忘れてしまいました
+0

ありがとう、これは私が望むように正確に動作します。 – Cavemanharris

+0

@Cavemanharris - この回答は、今日だけでなく、各日から行

+0

私はORの後のセクションのみを使用しており、完全に動作します。 – Cavemanharris

1

実際の日付にキャストすることができます。

WHERE CAST(CONCAT(cont_date_published, ' ', cont_time_published) AS DATETIME)<NOW() 

...これにより、クエリオプティマイザがインデックスを使用することを妨げる可能性があります。代替は、次のようになります。もちろん

WHERE cont_date_published<CURDATE() OR 
    (cont_date_published=CURDATE() AND cont_time_published<CURTIME()) 

、すべてのこの余分な作業を簡単に、単一のDATETIME列を利用し、適切なデータベース設計を回避することができます:それはあまりにも遅くはない場合

WHERE cont_published<NOW() 
+0

偉大な、この最初のもの - +1 –

+0

ÁlvaroGonzález - いくつかのテストの後、私が選択した最初のオプションは動作しませんでした。ここのソリューションはうまくいきました。 ..キャスト(Concat ..オプション – Cavemanharris

関連する問題