BETWEEN查询php日期无法正常工作

时间:2015-09-08 20:02:51

标签: php mysql

SELECT * FROM logs;

idDate accNum    idMonths dDay dYear dType    transacted_money dat
     4 862065095        9    8  2015 Withdraw             2323 09/08/2015
     5 862065095        9    8  2015 Deposit               333 09/08/2015

请帮我解决这个问题我想获取数据,以便我可以在PHP中操作它们。但首先我想在mysql中测试我的查询,以及它的结果。没有结果。为什么?我的查询错了吗?

嗯,我猜我的第一张照片已被删除,实际查询已完成

SELECT * FROM logs WHERE dat BETWEEN '9/8/2015' AND '9/13/2015';

3 个答案:

答案 0 :(得分:3)

您的日期是字符串,而不是实际的mysql日期,因此它们会通过 STRING 规则进行比较,这意味着:

'9/1/15' > '10/1/15' --> TRUE  (september comes after october?)

因为9在字符串上下文中大于1

请注意

'2015-09-01' > '2015-10-01' -> FALSE

修复你的表以将这些varchar字段转换为正确的date / datetime字段,或者你会做愚蠢的黑客攻击

WHERE str_to_date(varcharfield, ...) BETWEEN '2015-09-01' AND '2015-10-'01'

请注意上面示例中日期的格式。 MySQL期望/要求日期为yyyy-mm-ddyyyy-mm-dd hh:mm:ss格式,以将它们解析为日期。其他任何东西都只是一个字符串。

mysql> select '9/1/15' > '10/1/15', '2015-09-01' > '2015-10-01';
+----------------------+-----------------------------+
| '9/1/15' > '10/1/15' | '2015-09-01' > '2015-10-01' |
+----------------------+-----------------------------+
|                    1 |                           0 |
+----------------------+-----------------------------+
1 row in set (0.00 sec)

答案 1 :(得分:2)

尝试使用以下

WHERE DATE_FORMAT( `createdon` , '%Y-%m-%d' ) <= '2014-07-31'
AND DATE_FORMAT( `createdon` , '%Y-%m-%d' ) >= '2014-07-01'

31-07是结束日期,01-07是开始日期

答案 2 :(得分:0)

正如一些用户所指出的那样,这是一种非常糟糕的方法,因为你的日期是字符串并且不遵循mysql格式化日期的正确方式,但是因为你要求它这是一种方法:

SELECT * FROM test
WHERE
STR_TO_DATE(my_date, '%m/%d/%Y') BETWEEN '2015-09-09' AND '2015-09-12';

Demo.

P.S。要使用BETWEEN,您必须提供yyyy-mm-ddyyyy-mm-dd hh:mm:ss等日期。