我有一个mysql数据库,它有一个日期字段和一个时间字段。我需要从数据库中选择以下参数。
从spiff中选择,其中日期在2016年2月1日之间,时间等于或大于12:00:00,日期为2016年2月8日,时间小于或等于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发布于 2016-09-09 22:49:12
那是行不通的。您不能将日期和时间存储在单独的字段中,然后同时按这两个字段进行搜索。您将排除所有晚于"noon“的时间,这意味着如果您有以下日期/时间:
02/02/2016 13:00 excluded
02/03/2016 10:00 included
02/04/2016 17:59 excluded即使那些日期在您指定的范围内,13:00和17: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大。
发布于 2016-09-09 22:50:49
问题是您将日期和时间部分放在单独的字段中。由于where子句中的AND time <= '12:00:00'条件,MySQL将返回早上所有受影响日期的记录。
最好的解决方案是将这两个字段合并为一个具有datetime数据类型的字段。这样,where子句将是:
...`datime_field` BETWEEN '" . $week_before_noon . "' AND '" . $today_noon . "'这两个php变量将包含一个有效的日期时间表达式,格式为YYYY-MM-DD hh:mm:ss
另一种解决方案是动态组合两个字段的值,但这种方式不能使用索引来加快搜索速度:
... date + time BETWEEN '" . $week_before . " 12:00:00' AND '" . $today . " 12:00:00'https://stackoverflow.com/questions/39414197
复制相似问题