使用MYSQL / SQL在两个日期之间搜索?

时间:2016-04-17 09:45:54

标签: mysql sql

我有一张表是clientbike

SELECT stime,etime FROM clientbike

    stime       |  etime 
    --------------------------
    2016-04-01  |  2016-04-30

如果有人搜索stime = 2016-04-05& etime = 2016-04-07

结果发现

    2 Days... 

有人可以解释如何使用sql / mysql吗?

Thnaks

3 个答案:

答案 0 :(得分:0)

你需要复制下面的查询并在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

答案 1 :(得分:0)

如果我理解正确,您需要重叠的天数,EndDate是独占的。如果这是正确的,那么从这开始:

SELECT *
FROM clientbike
WHERE stime <= @ToDate
    AND etime >= @FromDate;

此查询将返回clientbike与搜索日期重叠的所有记录。以这种方式构造WHERE子句会检查@ToDate@FromDate之间的开始悬空,结尾,sdateedate以及sdate和{ {1}}介于edate@ToDate之间。

接下来我们需要修改@FromDate

SELECT

SELECT GREATEST(stime, @FromDate) AS startDate, LEAST(etime, @ToDate) AS endDate FROM clientbike WHERE stime <= @ToDate AND etime >= @FromDate; GREATEST的目的是确保我们只查看实际重叠的日期。 EX:如果LEASTstime = '2016-04-15',则@FromDate = '2016-04-22'。然后,我们将使用这两个字段来计算GREATEST(stime, @FromDate) = '2016-04-22'startDate之间的日期差异:

endDate

SELECT GREATEST(stime, @FromDate) AS startDate, LEAST(etime, @ToDate) AS endDate, DATEDIFF(LEAST(etime, @ToDate), GREATEST(stime, @FromDate)) as overlap FROM clientbike WHERE stime <= @ToDate AND etime >= @FromDate; 唯一重要的部分是SELECT函数,因此可以删除前两个字段。我把它们留在了,这样你就可以看到发生了什么。

答案 2 :(得分:0)

鉴于规范中的一个案例,它相当简单。规范中缺少的是stime和/或etime值的示例,它们相等,或完全或部分在客户端范围之外。或者etime值等于stime。对于搜索参数和列值。 (我强烈怀疑规范中的更多而不仅仅是一个案例。)

作为一个起点,这是一个恰好在规范中为“工作”的例子。这会在clientbike中为每个行返回一行。

设置

CREATE TABLE clientbike
( id      BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY
, stime   DATE NOT NULL 
, etime   DATE NOT NULL
); 

INSERT INTO clientbike (stime,etime) VALUES 
 ('2016-04-01','2016-04-30')
, ('2016-05-01','2016-05-30') ;

示例查询

SELECT b.id
     , IF(q.etime >= b.stime AND q.stime < b.etime, DATEDIFF(q.etime,q.stime), 0) AS days
  FROM clientbike b
 CROSS
  JOIN ( SELECT '2016-04-05' + INTERVAL 0 DAY AS stime
              , '2016-04-07' + INTERVAL 0 DAY AS etime
       ) q
 ORDER BY b.id  

注意:“搜索”值在内联视图q。

中提供

返回

  id  days
----  ----
   1     2
   2     0

作为另一个查询的荒谬例子,它也会满足给定的规范但实际上不可能扩展到其他情况......

SELECT b.id
     , IF(    b.stime = '2016-04-01'
          AND b.etime = '2016-04-30'
          AND q.stime = '2016-04-05'
          AND q.etime = '2016-04-07'
       , '2 Days...'
       , ''
       ) AS result
    FROM clientbike b     
 CROSS
  JOIN ( SELECT '2016-04-05' + INTERVAL 0 DAY AS stime
              , '2016-04-07' + INTERVAL 0 DAY AS etime
       ) q

返回

  id  result  
----  ---------
   1  2 Days...  
   2