首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用MYSQL / SQL在两个日期之间进行搜索?

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

Stack Overflow用户
提问于 2016-04-17 17:45:54
回答 3查看 155关注 0票数 2

我有一个是clientbike的桌子

从客户端自行车中选择stime、etime

代码语言:javascript
复制
    stime       |  etime 
    --------------------------
    2016-04-01  |  2016-04-30

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

找到结果

代码语言:javascript
复制
    2 Days... 

有人能解释一下如何使用sql / mysql吗?

技术

EN

回答 3

Stack Overflow用户

发布于 2016-04-17 18:41:46

你只需要复制下面的查询并在mysql中执行,然后你就可以看到这个查询返回了从开始日期到结束日期的计数条目的数量。

你可以通过两种方式实现这一点,

选项1

代码语言:javascript
复制
    SET @FromDate := '2016-04-1'  
    SET @ToDate := '2016-04-30' 

    SELECT COUNT(* ) FROM clientbike
    WHERE stime >= @FromDate AND etime <= @ToDate

这涵盖了所有日期范围的场景,如所选的@FromDate@ToDate都在表的开始和结束列中。

选项2

代码语言:javascript
复制
     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
票数 0
EN

Stack Overflow用户

发布于 2016-04-18 03:25:30

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

代码语言:javascript
复制
SELECT *
FROM clientbike
WHERE stime <= @ToDate
    AND etime >= @FromDate;

此查询将返回clientbike中与搜索日期重叠的任何记录。以这种方式构造WHERE子句将检查sdateedate之间是否存在start this、end this、@ToDate@FromDate,以及sdateedate是否位于@ToDate@FromDate之间。

接下来,我们需要修改SELECT

代码语言:javascript
复制
SELECT GREATEST(stime, @FromDate) AS startDate,
    LEAST(etime, @ToDate) AS endDate
FROM clientbike
WHERE stime <= @ToDate
    AND etime >= @FromDate;

GREATESTLEAST的要点是确保我们只查看实际重叠的日期。例如:如果是stime = '2016-04-15'@FromDate = '2016-04-22',则为GREATEST(stime, @FromDate) = '2016-04-22'。然后,我们将使用这两个字段来计算startDateendDate之间的日期差异

代码语言:javascript
复制
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中唯一重要的部分是DATEDIFF()函数,因此可以删除前面的两个字段。我只是把它们留在里面,这样你就可以看到发生了什么。

票数 0
EN

Stack Overflow用户

发布于 2016-04-18 04:06:19

考虑到规范中的一种情况,它相当简单。规范中缺少的是stime和/或etime值相等的示例,或者完全或部分超出客户端自行车范围的示例。或等于stime的eTime值。用于搜索参数和列值。(我强烈怀疑规范中有更多的内容,而不仅仅是这一种情况。)

作为起点,这里有一个例子,它恰好适用于规范中的情况。这将为clientbike中的每一行返回一行。

设置

代码语言:javascript
复制
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') ;

示例查询

代码语言:javascript
复制
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  

注意:"search“值是在内联视图q中提供的。

返回

代码语言:javascript
复制
  id  days
----  ----
   1     2
   2     0

作为另一个查询的可笑示例,该查询也将满足给定的规范,但实际上不可能扩展到其他情况...

代码语言:javascript
复制
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

返回

代码语言:javascript
复制
  id  result  
----  ---------
   1  2 Days...  
   2  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36674953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档