現在の日付と過去7日間の間にないデータを返したいとします。データの行数が多すぎると2つの日付が返されません
私のSELECTステートメントは正常に表示されますが、現在の日付のデータも返しています。
ON句で使用されるcustomer_idフィールドは、参照される2つのテーブルのいずれのプライマリキーでもありません。
質問には何が表示されないのですか?
現在の日付と過去7日間の間にないデータを返したいとします。データの行数が多すぎると2つの日付が返されません
私のSELECTステートメントは正常に表示されますが、現在の日付のデータも返しています。
ON句で使用されるcustomer_idフィールドは、参照される2つのテーブルのいずれのプライマリキーでもありません。
質問には何が表示されないのですか?
この問題は、通常、一方ではDATE
データ型の異なる意味、もう一方ではTIMESTAMP
またはDATETIME
データ型の異なる意味については混乱します。
たとえば、NOW()
は1-April-2017 09:35
です。 post_date
値が1-April-2017 08:20
のsales
テーブルに行があるとします。 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
操作が適用されます。 DATE
値DATETIME
又は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)
よりはるかに読みやすくなります。
明らかにしかし必要な質問 - "post_date"はdatetimeフィールドですか(varcharまたは何かではありません)?比較を行う前にキャストする必要がある場合は、 – ADyson
@ADyson、th 'post_date'フィールドはdatetimeフィールドです – Terungwa