web-dev-qa-db-ja.com

MySQL-2つの日付の間のデータベースからデータを選択します

ユーザーの登録の日付を日時として保存したので、たとえば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、しかし、これはあまり見栄えが良くありません。

13
user984621

あなたの問題は、日付の短いバージョンがデフォルトとして真夜中を使用することです。したがって、クエリは実際には次のようになります。

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));
35
dash

デフォルトの時刻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
5
Martin York
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
4
maprihoda

別の方法は、以下に示すように、左側のオペランドでDATE()関数を使用することです

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'

2
user7618441

> =および<=ではなく、前後に試しましたか?また、これは日付ですか、タイムスタンプですか?

1
vextorspace

created_at <= '2011-12-06'を検索すると、2011-12-06の午前0時以前に作成されたレコードが検索されます。 created_at < '2011-12-07'を検索したい。

1
Brian Hoover

以下のような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'

日付を単一引用符で囲んでください''

お役に立てれば。

0
Koushik Das

おそらくその間に使用する方が良いでしょう。範囲を取得してからフィルタリングするのに役立ちました

0
sys_debug