2

特定の日付(この例では現在の日付と7日前)の間にある行を取得するためにクエリを実行しています。

私はそれを次のように書いてみました:

SELECT * 
FROM faulttracker.ft_v_cases 
WHERE DATE(cs_created) BETWEEN DATE(NOW()) AND DATE(NOW()-INTERVAL 7 DAY) 
ORDER BY cs_created DESC;

しかし、0行を返しました。なぜうまくいかなかったのか理解できなかったので、次のように書き直してみました。

SELECT * 
FROM faulttracker.ft_v_cases 
WHERE DATE(cs_created) <= DATE(NOW()) 
AND DATE(cs_created) >= DATE(NOW()-INTERVAL 7 DAY) 
ORDER BY cs_created DESC;

どのDIDが機能しますか。

最初の行が0行を返したのに、2番目の行は期待どおりに機能したのはなぜですか?私が見る限り、それらは機能的に同等であるはずです。

cs_createdは日時です。

4

5 に答える 5

2

私はあなたが同じように使うことができるとかなり確信しています:

WHERE cs_created >= CURDATE() - INTERVAL 7 DAY 
  AND cs_created <  CURDATE() + INTERVAL 1 DAY

これにより、同じ結果が返されますが、クエリでインデックスを使用できるようになりますcs_created

于 2011-02-08T12:42:48.363 に答える
2

ドキュメントによると、BETWEENは次の形式を想定しています。

 expr BETWEEN min AND max

最初の例では、最小値を最後に配置しています。

使用してみてください:

SELECT * 
FROM faulttracker.ft_v_cases 
WHERE DATE(cs_created) BETWEEN DATE(NOW()-INTERVAL 7 DAY) AND DATE(NOW()) 
ORDER BY cs_created DESC;
于 2011-02-08T12:33:10.513 に答える
1

あなたの状態は-

WHERE DATE(cs_created) BETWEEN DATE(NOW()-INTERVAL 7 DAY) AND DATE(NOW())

Betweenを使用する場合は、日付の低い方の値を左側にする必要があります。

于 2011-02-08T12:31:22.503 に答える
0

BETWEEN smaller AND larger範囲は常に;として機能する必要があります。あなたが書くかどうかに関係なく、扱いは同じです:

x BETWEEN smaller AND larger
x >= smaller AND x <= larger

したがって、BETWEENを使用するコードは次のように記述する必要があります。

SELECT * 
  FROM faulttracker.ft_v_cases 
 WHERE DATE(cs_created) BETWEEN DATE(NOW() - INTERVAL 7 DAY) AND DATE(NOW())
 ORDER BY cs_created DESC;

もちろん、BETWEEN / ANDの範囲が含まれているため、これは過去8日間をカバーします。

于 2011-02-08T12:31:50.367 に答える
-1

あなたはそれをこのように置いてみましたか:

SELECT * FROM faulttracker.ft_v_cases WHERE CAST(cs_created AS DATE) BETWEEN CAST(NOW() AS DATE) AND CAST(DATE(NOW()-INTERVAL 7 DAY) AS DATE) ORDER BY cs_created DESC;

マニュアルには次のように記載されています。

日付または時刻の値でBETWEENを使用するときに最良の結果を得るには、CAST()を使用して値を目的のデータ型に明示的に変換します。

于 2011-02-08T12:33:23.970 に答える