2016-10-12 6 views
2

現在の日付と過去7日間の間にないデータを返したいとします。データの行数が多すぎると2つの日付が返されません

私のSELECTステートメントは正常に表示されますが、現在の日付のデータも返しています。

ON句で使用されるcustomer_idフィールドは、参照される2つのテーブルのいずれのプライマリキーでもありません。

質問には何が表示されないのですか?

+0

明らかにしかし必要な質問 - "post_date"はdatetimeフィールドですか(varcharまたは何かではありません)?比較を行う前にキャストする必要がある場合は、 – ADyson

+0

@ADyson、th 'post_date'フィールドはdatetimeフィールドです – Terungwa

答えて

4

この問題は、通常、一方ではDATEデータ型の異なる意味、もう一方ではTIMESTAMPまたはDATETIMEデータ型の異なる意味については混乱します。

たとえば、NOW()1-April-2017 09:35です。 post_date値が1-April-2017 08:20salesテーブルに行があるとします。 post_date列のデータ型がDATETIMEであるとします。

WHERE句は、値の適用後に次のようになります。

WHERE '2017-04-01 08:20' NOT BETWEEN CAST('2017-03-25 09:35' AS DATE) 
           AND CAST('2017-04-01 09:35' AS DATE) 

操作を適用すると、CAST操作が適用されます。 DATEDATETIME又はTIMESTAMP比較した場合

WHERE '2017-04-01 08:20' NOT BETWEEN '2017-03-25' 
           AND '2017-04-01' 

最後に、DATE値は、真夜中の時間を有するものと解釈されます。したがって、クエリは次のようになります。

WHERE '2017-04-01 08:20' NOT BETWEEN '2017-03-25 00:00:00' 
           AND '2017-04-01 00:00:00' 

そして、'2017-04-01 00:00:00'の後に'2017-04-01 08:20'です。あなたが必要なもの

はこれです:

WHERE 
NOT (
      post_date >= CURDATE() - INTERVAL 7 DAY --on or after midnight 2016-3-25 
     AND post_date < CURDATE() + INTERVAL 1 DAY --before midnight 2016-04-02 
    ) 

この式は8日の合計を包含することに注意してください。

あなたは範囲の終わりのための<を必要とし、BETWEENはそのすべての範囲の両端のための<=を使用していますので、あなたは、比較のこの種のBETWEENを使用することはできません。

また、CURDATE()は、CAST(NOW() AS DATE)よりはるかに読みやすくなります。

関連する問題