Mysql 其中返回的数据行太多,且不在两个日期之间
我想返回不在当前日期和最近7天之间的数据 我的SELECT语句看起来正常,但它也返回了当天的数据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
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'字段是日期时间字段