我有这张表,我给出的查询返回错误的结果,我不确定问题出在哪里
- 日期比较
或者
- 查询的结构
图像中不清晰的查询是:
select * from transact where item_code='msft234' or item_code='hp550x' and transact_date>=STR_TO_DATE('06-07-2013','%d-%m-%Y') and transact_date<=STR_TO_DATE('12-07-2013','%d-%m-%Y')
将项目条件放在()之间
(ítem_code = 'msft234' OR ítem_code = 'hp550x') AND transact_date>=STR_TO_DATE('06-07-2013','%d-%m-%Y') and transact_date<=STR_TO_DATE('12-07-2013','%d-%m-%Y')
(ítem_code = 'msft234' OR ítem_code = 'hp550x') AND STR_TO_DATE('06-07-2013','%d-%m-%Y') 和 STR_TO_DATE('12-07-2013','% d-%m-%Y')
为了安全起见,我将使用 2 ()
(ítem_code = 'msft234' OR ítem_code = 'hp550x') AND (transact_date BETWEEN STR_TO_DATE('06-07-2013','%d-%m-%Y') 和 STR_TO_DATE('12-07-2013',' %d-%m-%Y'))
您的查询使用了错误的语法:
WHERE item_code='msft234' OR item_code='hp550x'
AND transact_date>=STR_TO_DATE('06-07-2013','%d-%m-%Y')
AND transact_date<=STR_TO_DATE('12-07-2013','%d-%m-%Y')
由于 AND 优先级更高,这意味着如果您在该日期间隔内获得 hp550x ,或者无论日期如何,您都会得到满足。msft234
您必须将OR
'ed 项目代码放在括号中:(item_code='..' OR item_code='..' OR ..)
,或使用IN
:例如
SELECT * FROM transact
WHERE item_code IN ('msft234', 'hp550x')
AND transact_date BETWEEN
STR_TO_DATE('06-07-2013','%d-%m-%Y')
AND
STR_TO_DATE('12-07-2013','%d-%m-%Y')
此外,根据您为日期字段选择的类型,请考虑“小于或等于 12-07-2013”的日期,它必须在 00:00 小于或等于 12-07-2013,即,几乎匹配的最新日期是 2013 年 7 月 11 日 23:59:59。
因此,“小于或等于 12-07”实际上永远不会选择 12-07-2013 中的任何行,除非它恰好在午夜插入。
如果您仅通过指定date来插入行,那么它很可能会起作用 - 这些行将在午夜输入并在午夜匹配。但是,如果(某些)行使用完整的日期时间输入,例如因为它们是日期时间类型并使用 更新NOW()
,那么它们将不匹配。