我有一张表是clientbike
SELECT stime,etime FROM clientbike
type = datetime
结果
stime | etime
--------------------------------------------
2016-04-18 00:00:00 | 2016-05-18 00:00:00
--------------------------------------------
2016-04-05 00:00:00 | 2016-06-05 00:00:00
--------------------------------------------
2016-04-03 00:00:00 | 2016-07-03 00:00:00
现在我想搜索功能:
找到所有查询结果0但我想要3 ...
使用> = AND< =
搜索查询 SELECT stime,etime FROM clientbike WHERE
stime >= '2016-04-25 00:00:00' AND
etime <= '2016-04-26 00:00:00'
错误
No Result Found...
使用
之间的搜索查询 SELECT stime,etime FROM clientbike WHERE
stime BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' AND
etime BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00'
错误
No Result Found...
使用str_to_date
之间的搜索查询 SELECT stime,etime FROM clientbike WHERE
STR_TO_DATE(stime, '%Y-%m-%d') BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00' AND
STR_TO_DATE(etime, '%Y-%m-%d') BETWEEN '2016-04-25 00:00:00' AND '2016-04-26 00:00:00'
错误
No Result Found...
有人可以解释这种行为吗?
答案 0 :(得分:2)
stime | etime
------------------------
15-04-2016 | 31-06-2016
该格式表示您的字段为varchar
而不是date
,因此您无法比较它们,通常可以比较date
。
如果您使用正确的date
类型字段,格式将为YYYY-MM-DD
,然后任何标准比较都可以正常工作。由于情况并非如此,您必须将这些字符串转换为日期才能正确比较它们。
最佳做法是更改字段以使用正确的数据类型,即DATE
答案 1 :(得分:0)
您必须将列转换为日期
STR_TO_DATE(stime, '%Y-%m-%d')
请试试这个
SELECT stime,etime FROM clientbike
WHERE STR_TO_DATE(stime, '%Y-%m-%d') BETWEEN '2016-04-01' AND '2016-04-17'
AND STR_TO_DATE(etime, '%Y-%m-%d') BETWEEN '2016-05-01' AND '2016-07-26'
或
数据库中的将该列从varchar更改为date或datetime
修改强>
答案 2 :(得分:0)
我可以在你的问题中看到你的stime和etime列是字符串类型的第一件事,所以在数据库中将数据类型更改为日期,并且为了调试你可以查看下面的查询。
你需要复制下面的查询并在mysql中执行,然后你可以看到这个查询返回从开始日期到结束日期的计数条目数。
你可以通过两种方式实现这一目标,
选项1
SET @FromDate := '2016-04-1'
SET @ToDate := '2016-04-30'
SELECT COUNT(* ) FROM clientbike
WHERE stime >= @FromDate AND etime <= @ToDate
这涵盖了所有日期范围内的情况,例如选定的@FromDate
和@ToDate
,这两种情况都在表格的开始和结束列中。
选项2
SET @FromDate := '2016-04-1'
SET @ToDate := '2016-04-30'
SELECT count(*) FROM clientbike WHERE stime BETWEEN @FromDate AND @ToDate AND etime BETWEEN @FromDate AND @ToDate