2015-06-03 26 views
0

我正试图使用​​>=<=运算符找到日期之间的记录,但结果不正确。无法在两个日期之间找到正确的记录

我有两个输入框,通过用户选择日期:

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

你还在研究这个吗? – AdamMc331

回答

1

你这样做是错误的。不要将日期转换为字符串。将字符串输入转换为日期。

变化

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因为您将部分时间也。

+0

你可以请检查我的问题becouse已更新我的问题。 –

+0

应该是'DATE_FORMAT(created_date,'%d /%m /%Y')<'21/04/2015''。如果你希望数据在'21'之前,不需要'='。 –

+0

嗨。我已经使用这个SQL'SELECT * FROM tma_38 WHERE CITY LIKE'%%'and created_date> ='2015-04-15'AND created_date <='2015-04-21'ORDER BY created_date ASC LIMIT 0,10' and getting只有两个记录。我得到这个记录'1 >> 2015-04-15 10:49:26 2 >> 2015-04-17 09:49:06' –

2

使用像这样

created_date between $filter["company_date_from"] and $filter["company_date_to"] 
0

更改和设置过滤器的日期格式之间的SQL。与尝试 -

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'])))."' 
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

相关问题