2

2 つの日付の間にある行を選択しようとしています。まず、ここに私のデータがあります:

punch_id    eid     time    unixtime    punch_type  day     date        doy
135          2      12:53   1314723193  0            4   08/28/2011     241  
134          2      12:53   1314723190  3            4   08/31/2011     241
133          2      12:53   1314723187  2            4   08/20/2011     241
132          2      12:52   1314723125  1            4   08/30/2011     241

これら2つのクエリを試しました。

SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` <= '08/31/11'

SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11' AND '08/31/11'

どちらも、日付 08/31/11 を含む行を選択しません。ただし、08/20/11 のものを選択します。別の方法で使用しようとしましたが、クエリを実行すると:

SELECT * FROM `punches` WHERE `date` >= '08/10/11' AND `date` <= '08/20/11'

ここでも正しい結果が得られません。20 番目が再び除外されています。これを実行する方法の問題は何ですか?

4

4 に答える 4

3

この関連する質問を参照してください。

他の人が述べたように、あなたの主な問題は時間を考慮していません。それを処理するためのいくつかのオプション:

  1. 関数を使用して DateTime を Date に変換します。このオプションはお勧めしません。関数がサージ不可になる可能性が高いからです。

  2. 1 日の最後の瞬間を明示的に含めるように展開しますBETWEEN: (注: これは、MS SQL が格納できる最新の可能な値です。MySQL が同じ値を持つかどうかはわかりません)

    SELECT * FROM `punches` WHERE `date` 
    BETWEEN '08/20/11 00:00:00.000' AND '08/31/11 23:59:59.997'
    
  3. <上限値にa を使用

    SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` < '09/01/11'
    

実際、ほとんどの状況では、最後の方が簡単だと思います。

列のデータ型を変更するなど、他のこともできると思いますが、ここでは、クエリを変更することに関心があるだけだと想定しています。

** 免責事項: 私は MySQL ではなく、MS SQL の専門家です。

于 2011-08-30T17:59:33.477 に答える
1

私はmysqlを知りませんが、他のRDBMSでは、日付は午前12時を想定しています。高値日を含める場合は、その日に 1 を追加します。

于 2011-08-30T17:50:54.950 に答える
1

日付とともに時刻を指定しない場合、00:00:00 が暗黙的に示されます。したがって、データベースが実行している実際のクエリは、より似ています...

SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11 00:00:00' AND '08/31/11 00:00:00'

したがって、2011 年 8 月 31 日の 12:53 のパンチは含まれません。これはうまくいくはずで、終了日に1日追加するよりも少しエレガントだと思います...

SELECT * FROM `punches` WHERE DATE(`date`) BETWEEN '2011-08-20' AND '2011-08-31'
于 2011-08-30T17:53:24.857 に答える
1

あなたのdateフィールドはタイプDATEですかDATETIME

それはおそらく、一日の時間と関係があります。DATETIMEとして保存されている場合

2011-08-31 13:00:00

その後、一致しません

BETWEEN '08/20/11' AND '08/31/11'

使用する必要があります

BETWEEN '08/20/11' AND '09/01/11'

betweenのMySQLドキュメントでは、最大値が「以下」に一致すると述べているため、おそらくあなたを怒らせる時間帯です。

于 2011-08-30T17:52:32.297 に答える