ユーザーの登録の日付を日時として保存したので、たとえば2011-12-06 10:45:36です。私はこのクエリを実行しましたが、このアイテムを期待していました-2011-12-06 10:45:36-選択されます:
SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND
created_at <= '2011-12-06'
しかし、そうではありません。エレガントな方法がありますが、このアイテムの選択方法は?私が得た最初のアイデアは2011-12-06 + 1
、しかし、これはあまり見栄えが良くありません。
あなたの問題は、日付の短いバージョンがデフォルトとして真夜中を使用することです。したがって、クエリは実際には次のようになります。
SELECT users.* FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
10:45の記録が表示されないのはこのためです。
次のように変更します。
SELECT users.* FROM users
WHERE created_at >= '2011-12-01'
AND created_at <= '2011-12-07'
以下も使用できます。
SELECT users.* from users
WHERE created_at >= '2011-12-01'
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)
これは、探しているのと同じ間隔ですべてのユーザーを選択します。
BETWEEN演算子の方が読みやすい場合もあります。
SELECT users.* from users
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
デフォルトの時刻00:00:00のない日付として、「2011-12-07」をエンドポイントとして使用する必要があります。
したがって、実際に記述した内容は次のように解釈されます。
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
タイムスタンプは2011-12-06 10:45:36で、これらのポイントの間にありません。
これも変更します。
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01' -- Implied 00:00:00
AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than
-- thus any time on 06
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
別の方法は、以下に示すように、左側のオペランドでDATE()
関数を使用することです
SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'
> =および<=ではなく、前後に試しましたか?また、これは日付ですか、タイムスタンプですか?
created_at <= '2011-12-06'
を検索すると、2011-12-06の午前0時以前に作成されたレコードが検索されます。 created_at < '2011-12-07'
を検索したい。
以下のようなMySQL DATE
関数を使用できます
たとえば、2017-09-05から2017-09-09までの結果が必要な場合
SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09'
日付を単一引用符で囲んでください''
お役に立てれば。
おそらくその間に使用する方が良いでしょう。範囲を取得してからフィルタリングするのに役立ちました