我正在尝试使用>=
和<=
运算符查找日期之间的记录,但结果不合适。
我有两个输入框用于传递用户选择的日期:
company_date_from (15/04/2015)
company_date_to (20/04/2015)
和表格tma_38
,我的日期字段名称为created_date (timestamp)
表记录:
company_id created_date
---------- -------------------
10 2015-04-15 10:49:26
13 2015-04-17 09:49:06
14 2015-04-21 14:59:42
15 2015-05-20 14:26:07
16 2015-04-21 18:42:00
我正在使用的查询:
SELECT *
FROM tma_38
WHERE city LIKE '%%'
AND DATE_FORMAT( created_date, '%d/%m/%Y' ) >= '15/04/2015'
AND DATE_FORMAT( created_date, '%d/%m/%Y' ) <= '21/04/2015'
ORDER BY created_date ASC
LIMIT 0 , 10
目前,它正在返回我不想要的所有结果。我做错了什么?
答案 0 :(得分:2)
在这样的
之间使用sqlcreated_date between $filter["company_date_from"] and $filter["company_date_to"]
答案 1 :(得分:1)
你做错了。不要将日期转换为字符串。将字符串intput转换为日期。
更改
AND DATE_FORMAT(created_date, '%d/%m/%Y' ) >= '15/04/2015'
到
AND created_date >= STR_TO_DATE('15/04/2015','%d/%m/%Y')
或使用默认日期格式
SELECT *
FROM tma_38
WHERE city LIKE '%%'
AND created_date >= '2015-04-15'
AND created_date < '2015-04-22'
ORDER BY created_date ASC
LIMIT 0 , 10
我选择2015-04.22
代替21
,因为您也存储了时间部分。
答案 2 :(得分:0)
更改并设置过滤器的日期格式。试试 -
AND created_date <= '".date('Y-m-d 00:00:00', strtorime(str_replace('/', '-', $filter['company_date_to'])))."'"
或者您可以尝试使用BETWEEN
-
created_date BETWEEN
'".date('Y-m-d 00:00:00', strtorime(str_replace('/', '-', $filter['company_date_from '])))."'
AND
'".date('Y-m-d 00:00:00', strtorime(str_replace('/', '-', $filter['company_date_to'])))."'
答案 3 :(得分:0)
这不起作用的原因是因为用这样的字符串格式化的日期无法正常工作。
字符串比较从头开始,因此像10/04/2010
这样的数字将被视为大于04/04/2015
,这显然不是真的。使用ISO格式存储部分原因日期是因为yyyy-mm-dd
格式可以防止不正确的字符串比较。
此外,您的表格设计可以用于您的优势,因为该列存储为timestamp
,并且MySQL已经有多个date and time functions设计用于处理这些类型。
要修复查询,您需要将值视为timestamp
类型,并且与MySQL中的其他类型一样,您可以在它们上使用比较运算符。因此,要检查范围之间的日期,您可以执行以下两种操作之一:
WHERE myDate >= startDate AND myDate <= endDate
---
WHERE myDate BETWEEN startDate AND endDate
这两个选项都是等价的,有些人认为BETWEEN
更具可读性,但这是个人喜好。请注意,在这些示例中,startDate和endDate也应采用yyyy-mm-dd
格式。