繁体   English   中英

mysql在两个日期/时间之间选择

[英]mysql select between two dates / times

我有一个mysql数据库,它有一个日期字段和一个时间字段。 我需要从db中选择以下参数。

选择spiff,其中日期是在02/01/2016之间,时间等于或更大,然后是12:00:00和日期02/08/2016,时间等于或小于11:59:59

所以在简单的论坛中,我想选择从7天前到今天中午到中午的所有内容,其中12; 00:00是截止时间。

我有这个代码,但它并没有做我想要的

SELECT * 
FROM spiff 
WHERE `date` BETWEEN '" . $week_before . "' AND  '" . $today . "' AND time <= '12:00:00'  
ORDER by id DESC

那不行。 您不能将日期和时间存储在单独的字段中,然后按两者搜索。 您排除的时间超过“中午”,这意味着如果您有这些日期/时间:

02/02/2016 13:00    excluded
02/03/2016 10:00    included
02/04/2016 17:59    excluded

即使那些日期落在你指定的范围内, 13:0017:59的日期也会被排除,因为它们不是< '12:00:00'

您需要将日期存储为单个日期时间字段,然后您的查询变得微不足道:

SELECT ... WHERE datetimefield BETWEEN '2016-02-01 12:00:00' AND '2016-02-08 11:59:59'

请注意,对于这些类型的日期/时间比较工作,您必须使用mysql的实际日期/时间字段,以及mysql的日期 - 时间字符串格式: yyyy-mm-dd 如果您的日期存储为mm/dd/yyyy ,那么它们不是日期,它们是字符串,并且mysql的字符串比较规则适用,这意味着

'10/11/2015' > '09/01/1970' -> TRUE

因为10大于09

问题是您在单独的字段中有日期和时间部分。 由于where子句中的AND time <= '12:00:00'条件,MySQL将从早上返回所有受影响日期的记录。

最好的解决方案是将两个字段组合成一个具有datetime数据类型的字段。 这样where子句将是:

...`datime_field` BETWEEN '" . $week_before_noon . "' AND  '" . $today_noon . "'

2个php变量将包含一个有效的日期时间表达式,格式为YYYY-MM-DD hh:mm:ss

另一种解决方案是动态组合来自2个字段的值,但这样您就无法使用索引来加速搜索:

... date + time BETWEEN '" . $week_before . " 12:00:00' AND  '" . $today . " 12:00:00'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM