2017-02-03 22 views
3

日付と時刻の処理は常に私にとっては挑戦でしたが、私はSEについてmysqlの日付クエリに関する豊富な調査を行っていますが、私の問題を助けるために。Select *は、現在の日付が現在よりも大きく現在の時刻が現在よりも大きい場合に一致します

有効期限が切れていないすべての試合を表示する必要がある仕事をしているのですが、の日付が過ぎてから一致すると、が終了します。

例:試合はまだ試合日が今日は...私はあなたが取得していない過去だと思いました時間は、私が何を意味することを提供しているにもかかわらず、アクティブにすることができ

上記は単純な部分であり、難しい部分は実装です。私は行くことができる

SELECT * FROM matches WHERE match_date >= CURDATE();

は私の質問(複数可)

  • どのように私はそれ関数がをaswell時間が含まれていることを上記のクエリを変更するのでしょうか?
  • DATEに関する上記のクエリは、達成したいと思うものに使用できる最も効果的なクエリですか?

    SELECT * 
    FROM matches 
    WHERE match_date > CURDATE() OR 
         (match_date = CURDATE() and match_time > CURTIME()); 
    

    注:あなたは本当に単一のフィールドに日付と時刻を格納する必要があり

すべてのヘルプ/アドバイスは、私は、これが何をしたいんだと思う

+0

列型として 'datetime'を使用できませんか?それはまさに昼+時間を表すものです。そうすれば 'match_time> = NOW()'を使うことができます。 – ccKep

答えて

5

を高く評価しました。次に、あなたはできる:

SELECT m.* 
FROM matches m 
WHERE match_datetime >= now(); 

もっと簡単です。インデックスを使用する可能性が高くなります。

+0

あなたは素晴らしい仕事をしてくれてありがとう – Marilee

1

DATETIMETIMESTAMP()の機能と組み合わせることができます。少なくともmatch_dateのためにあなたが冗長状態match_date >= CURDATE()を追加することができ、インデックスを使用するためには

SELECT * FROM matches WHERE TIMESTAMP(match_date, match_time) >= NOW() 

SELECT * 
FROM matches 
WHERE match_date >= CURDATE() 
    AND TIMESTAMP(match_date, match_time) >= NOW() 

最初の条件は、今日の前のすべてをインデックスを使用して無視します。

DATETIMEまたはTIMESTAMP列を使用すると、前述の他のことがより簡単になります。 MySQL 5.7.6(またはそれ以上)を使用している場合は、computed/generated columnを作成して索引付けすることもできます。

関連する問題