我有一张表是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
答案 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
之间的开始悬空,结尾,sdate
和edate
以及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:如果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
函数,因此可以删除前两个字段。我把它们留在了,这样你就可以看到发生了什么。
答案 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