我有一个是clientbike的桌子
从客户端自行车中选择stime、etime
stime | etime
--------------------------
2016-04-01 | 2016-04-30如果有人搜索stime = 2016-04-05 & etime = 2016-04-07
找到结果
2 Days... 有人能解释一下如何使用sql / mysql吗?
技术
发布于 2016-04-17 18:41:46
你只需要复制下面的查询并在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发布于 2016-04-18 03:25:30
如果我理解正确的话,您想要的是重叠天数,其中EndDate是独占的。如果这是正确的,那么从这个开始:
SELECT *
FROM clientbike
WHERE stime <= @ToDate
AND etime >= @FromDate;此查询将返回clientbike中与搜索日期重叠的任何记录。以这种方式构造WHERE子句将检查sdate和edate之间是否存在start this、end this、@ToDate和@FromDate,以及sdate和edate是否位于@ToDate和@FromDate之间。
接下来,我们需要修改SELECT
SELECT GREATEST(stime, @FromDate) AS startDate,
LEAST(etime, @ToDate) AS endDate
FROM clientbike
WHERE stime <= @ToDate
AND etime >= @FromDate;GREATEST和LEAST的要点是确保我们只查看实际重叠的日期。例如:如果是stime = '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中唯一重要的部分是DATEDIFF()函数,因此可以删除前面的两个字段。我只是把它们留在里面,这样你就可以看到发生了什么。
发布于 2016-04-18 04:06:19
考虑到规范中的一种情况,它相当简单。规范中缺少的是stime和/或etime值相等的示例,或者完全或部分超出客户端自行车范围的示例。或等于stime的eTime值。用于搜索参数和列值。(我强烈怀疑规范中有更多的内容,而不仅仅是这一种情况。)
作为起点,这里有一个例子,它恰好适用于规范中的情况。这将为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 注意:"search“值是在内联视图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 https://stackoverflow.com/questions/36674953
复制相似问题