Mysql 其中返回的数据行太多,且不在两个日期之间

Mysql 其中返回的数据行太多,且不在两个日期之间,mysql,datetime,Mysql,Datetime,我想返回不在当前日期和最近7天之间的数据 我的SELECT语句看起来正常,但它也返回了当天的数据 SELECT customer.id AS id, customer.customer_id AS customer_id, customer.name AS name, customer.phone1 AS phone1, customer.location_area AS location_area, sales.post_date AS post

我想返回不在当前日期和最近7天之间的数据

我的SELECT语句看起来正常,但它也返回了当天的数据

SELECT
    customer.id AS id,
    customer.customer_id AS customer_id,
    customer.name AS name,
    customer.phone1 AS phone1,
    customer.location_area AS location_area,
    sales.post_date AS post_date 
FROM 
    sales
INNER JOIN 
    customer
ON 
    sales.customer_id = customer.customer_id
WHERE 
    post_date 
NOT BETWEEN 
   CAST( DATE_SUB(NOW(), INTERVAL 7 DAY) AS DATE )
AND 
   CAST( NOW() AS DATE )
ORDER BY 
   sales.id 
DESC
LIMIT 30
请注意ON子句中使用的customer_id字段不是两个引用表中的主键


我的查询中可能缺少什么?

这个问题通常是混淆了
日期
数据类型与
时间戳
日期时间
数据类型的不同含义

假设
NOW()
2017年4月1日09:35
。假设您在
sales
表中有一行的
post\u date
值为
2017年4月1日08:20
。假设您的
post\u 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
操作,我们得到

WHERE '2017-04-01 08:20' NOT BETWEEN '2017-03-25'
                                 AND '2017-04-01'
最后,当将
日期时间
时间戳
日期
值进行比较时,
日期
值被解释为午夜时间。因此,您的查询如下所示:

WHERE '2017-04-01 08:20' NOT BETWEEN '2017-03-25 00:00:00'
                                 AND '2017-04-01 00:00:00'
你猜怎么着<代码>'2017-04-01 08:20'在2017-04-01 00:00:00'之后是

您需要的是:

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
     )
在哪里
不是(
发布日期>=CURDATE()-间隔7天——2016年3月25日午夜或之后
和发布日期
请注意,此表达式总共包含八天


您不能使用
BETWEEN
进行此类比较,因为您需要
明显但必要的问题——“post_date”是日期时间字段(而不是varchar或其他什么)?如果不是,您可能需要在执行comparison@ADyson,th'post_date'字段是日期时间字段