MySQLが今日と同じ日付を選択


96

私はmysqlのselectステートメントを実行して、今日の日付を調べ、その日に登録した結果のみを返すようにしています。私は現在以下を試しましたが、うまくいかないようです。

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

私は私のSELECT声明をこれに変更しました、皆さんありがとう。

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()


signup_date日時フィールドのようです
セルギーストツキー

@Serjioはい、現在は日時フィールドです。
Jako

signup_date時刻が含まれている場合のデータ型は何ですか。次に、WHERE句でdate_formatを使用して時刻をCURDATE()
取り除き

@bluefeetありがとう、スクリプトを変更しました。動作しているようですが、結果がない場合。mysql_num_rows0は表示されません。空白のみです。
Jako、

回答:


197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()

フィールドが日付タイプであっても、DATE()を使用する必要がありますか?
rashidnk 2015

2
@rashidnkいいえDATETIME。質問では明確に述べていませんでしたが、フィールドは明らかにタイプです。
Barmar 2015

2
このソリューションは完全に正しいですが、適切にスケーリングされません(signup_dateそのようなインデックスが存在する場合でも、でインデックスを使用することはできません)。セルジオのソリューション優先する
RandomSeed 2015年

または特定の日付で検索する場合、インデックスも利用されます `` `SELECT users.id、DATE_FORMAT(users.signup_date、 '%Y-%m-%d')FROM users where signup_date> = '2017-08 -30 00:00:00 'およびsignup_date <=' 2017-08-30 23:59:59 '; `` `
Sumit M Asok

3
@SumitMAsok < '2017-08-31 00:00:00'MySQLのバージョンをミリ秒で使用している場合に使用することをお勧めします。
Barmar

29

signup_dateフィールドにインデックスがある場合、このクエリはインデックスを使用します

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)

この回答への反対票はばかげています。signup_date他のアプローチとは異なり、このクエリはのインデックスを活用できるため、これは実際に推奨されるアプローチです。
RandomSeed 2015年

2
@RandomSeed signup_date2つの時間をテストするという一般的な考え方は正しいですが、時間は正しくありません。現在の日付の間である必要が00:00あり23:59:59ます。
Barmar

まあ日付の間隔も間違っていた>。<結局、反対投票はそれほどばかげたことではなかった。
RandomSeed 2015年

このクエリは(インデックスにより)パフォーマンスが向上します。WHERE DATE(signup_date) = CURDATE()ここでは、この1 0.8ミリ〜50ミリ秒を私のサーバーを取りました。
カイノアック

13

にフォーマットを追加する必要があるようですWHERE

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

SQL Fiddle with Demoを見る


1

あなたは使うことができCONCATCURDATE()、一日の全体の時間と使用して、フィルタにBETWEENしてWHERE条件:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.