157

句を使用してクエリを実行するとbetween、終了値が除外されるようです。
例えば:

select * from person where dob between '2011-01-01' and '2011-01-31'

dobこれは、'2011-01-01' から '2011-01-30' までのすべての結果を取得します。dob「2011-01-31」のレコードをスキップします。dobこのクエリがこのように動作する理由と、 「2011-01-31」であるレコードを含めるように変更する方法を誰かが説明できますか? (ユーザーによって選択されているため、終了日に 1 を追加することはありません。)

4

11 に答える 11

319

MySQLから-マニュアル:

これは、式(min <= expr AND expr <= max)と同等です。

于 2011-02-22T16:30:57.403 に答える
199

フィールドdobにはおそらく時間コンポーネントがあります。

切り捨てるには:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'
于 2011-02-22T16:40:17.183 に答える
113

問題は、2011-01-31 が実際には 2011-01-31 00:00:00 であることです。それが一日の始まりです。日中のすべては含まれていません。

于 2011-02-22T16:35:13.513 に答える
34
select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'
于 2011-02-22T16:30:42.797 に答える
8

クエリで参照しているフィールドはDate型ですか、それともDateTime型ですか?

あなたが説明する動作の一般的な原因は、実際には Date 型を使用する必要がある場合に DateTime 型を使用する場合です。つまり、誰かが生まれた時間を本当に知る必要がない限り、Date 型を使用してください。

最終日が結果に含まれていない理由は、クエリで指定しなかった日付の時間部分がクエリで想定されているためです。

つまり、クエリは 2011 年 1 月 30 日から 2011 年 1 月 31 日までの真夜中までと解釈されますが、データは 2011 年 1 月 31 日の後半に値を持つ可能性があります。

提案: フィールドが DateTime タイプの場合は、Date タイプに変更してください。

于 2011-02-22T16:34:59.517 に答える
6

こんにちは、このクエリは私にとってはうまくいきます。

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'
于 2013-12-09T23:18:09.350 に答える
4
select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'

驚くべきことに、このような変換は、MySQL の多くの問題に対する解決策です。

于 2013-08-14T12:22:42.757 に答える
0

日付の上限を日付+1日とするので、あなたの場合は2011-02-01とします。

于 2011-02-22T16:26:52.520 に答える
0

クエリは次のように実行できます。

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

他の人が指摘したように、日付がハードコードされている場合。

一方、日付が別のテーブルにある場合は、次のように、日を追加して秒を減算できます (日付が秒/時刻なしで保存されている場合)。

select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)

フィールドでキャストを行うことは避けてくださいdob(受け入れられた回答のように)。これは、パフォーマンスに大きな問題を引き起こす可能性があるためです(フィールドにインデックスがdobあると仮定すると、フィールドでインデックスを使用できないなど)。やのようなものを作ると実行計画が から に変わっusing index conditionてしまうことがあるので注意!using whereDATE(dob)CAST(dob AS DATE)

于 2019-01-04T17:37:36.553 に答える