使用SQL在两个日期之间查询?

时间:2016-04-17 06:27:26

标签: mysql sql

我有一张表是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...

有人可以解释这种行为吗?

3 个答案:

答案 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

修改

sqlfiddle example

答案 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