我有一个名为barcode_log
的表,这些是表中的所有数据。
现在如果我运行此查询
SELECT * FROM `barcode_log` WHERE barcode_log.assign_time BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY) AND CURRENT_DATE;
我得到了这个结果
但它应返回所有行,因为所有数据仅在本月内。 assign_time
字段存储为datetime
。知道我做错了吗?
答案 0 :(得分:2)
您忽略了time
部分(hh:mm:ss
)。
如果结束日期设置为当前日期的结束时间戳,那么您也可以获取当天的数据。
BETWEEN是包容性的
SELECT
*
FROM
`barcode_log`
WHERE
barcode_log.assign_time BETWEEN DATE_SUB(
CURRENT_DATE,
INTERVAL 30 DAY
)
AND TIMESTAMP(CONCAT(CURDATE(),' ','23:59:59'));
答案 1 :(得分:2)
虽然接受的答案有效,但有一个更简单的解决方案。只需获取datetime列的日期部分:
SELECT
*
FROM
`barcode_log`
WHERE
DATE(barcode_log.assign_time)
BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY) AND CURRENT_DATE;
答案 2 :(得分:0)
还有另一种方法:barcode_log.assign_time
字段上的 CAST()。
SELECT *
FROM `barcode_log`
WHERE CAST(barcode_log.assign_time AS DATE)
BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY) AND CURRENT_DATE;
这从比较中排除了时间,并且可以很好地满足您的目的。