MySQLを使用して2つの日付間でクエリを実行するにはどうすればよいですか?


225

次のクエリ:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

何も返しません。

クエリが機能するのに十分なデータが必要です。何が悪いのですか?


32
両方として、BETWEENと慎重にmin及びmax値が範囲内にあると考えられるのいずれかで二回日付を処理しないこと、minおよびmax値(エッジケース)。たとえば、日付は2010-09-29 00:00:00なり2010-09-28 00:00:002010-09-29 00:00:00 の間2010-09-29 00:00:00、および2010-09-30 00:00:00
minipif

ええ、彼が言ったこと^^
アルバート・ラネツパーガー

回答:


472

2番目の日付が最初の日付より前です(つまり、2010年9月29日から2010年1月30日の間にクエリを実行しています)。日付の順序を逆にしてみてください:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

私はこれを知っていましたが、UPDATEに問題があります。BETWEENをUPDATEに使用しようとしていますが、同じように機能しますか?
Ingus

3
@IngusGraholskis:where句はselector updateステートメントで同じように機能する必要があります。
T30

個人的には、「from」と「to」という用語は、クエリを書き込む順序を覚える卑劣な方法です。
KeaganFouche

両方の日付がnullまたは空の場合にすべてのデータを返す方法は?
コーディングワールド

23

クエリの日付は

select * from table between `lowerdate` and `upperdate`

試す

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

20

あるdate_fieldタイプのdatetime?また、最初の日付を最初に置く必要があります。

そのはず:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

17

DATE()は、日付または日付/時刻式の日付部分のみを抽出するMySQL関数です

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

あなたがしていることを人々が理解できるように説明を加えることができます。
Franz Gleichmann、2016

7

@sabinからの回答の拡張と、日付部分のみ(時間なし)を比較したい場合のヒント:

比較するフィールドがdatetimeタイプのものであり、比較のために日付のみが指定されている場合、これらの日付は内部的にdatetime値に変換されます。つまり、次のクエリ

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

に変換されます

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

内部的に。

これにより、結果として、時間値が00:00:00より大きい2010-09-29のオブジェクトが含まれない結果になります。

したがって、日付が2010-09-29のすべてのオブジェクトも含める必要がある場合は、比較するフィールドを日付に変換する必要があります。

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

4

以上または以下と比較することにより、手動で行うことができます。

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

この例では、特定の日からデータを取得する必要があります。当日の初めから別の日の最後の秒までを比較します。

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

1

サーバー側またはクライアント側の日付構成に問題がある可能性があります。ホストがスペイン語、フランス語などで構成されている場合、複数のデータベースでこれが一般的な問題であることがわかりました...形式dd / mm / yyyyまたはmm / dd / yyyyに影響する可能性があります。


3
問題は、古い日付が新しい日付の前にリストされていたことでした。
theninjagreg 2015年

1

date_fieldを日付としてキャストするだけです

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

1

日付使用している場合時間の値を、あなたはのようにフィールドをキャストしなければなりません。試してください:DateTimeDate

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.