存储表
| product_id | days
| 10 | 5
| 12 | 3
怎么找? 在2018-04-01到2018-04-05期间,产品存放了多少天?
找到结果
SELECT product_id, SUM(DATEDIFF(date_remove, date_add)) as days
FROM storage
where date_remove BETWEEN '2018-04-01 00:00:00'
AND '2018-04-05 23:59:59'
AND date_add BETWEEN '2018-04-01 00:00:00'
AND '2018-04-05 23:59:59'
GROUP BY product_id
试
| product_id | days
| 10 | 7
但结果有误,因为' SUM'全天总结
获得结果
| product_id | days
| 10 | 5
正确的结果
{{1}}
UPD
结果9,646805555556但可能最长5天且product_id 13正确0,436608796296但结果为0,87
答案 0 :(得分:1)
首先,您要查看2018-04-01至2018-04-05范围内或与之重叠的所有日期范围。
where date_add < date '2018-04-06' and date_remove >= date '2018-04-01'
然后,根据找到的范围,您只想考虑2018-04-01到2018-04-05范围内的日期。
greatest(date_add, date '2018-04-01')
least(date_remove, date '2018-04-06')
然后你要数天。在这里你需要一个规则。你想看看单一范围,只考虑你加起来的整天吗?或者您想要考虑日分数,添加所有结果并查看结果有多少天?对于后者,您可以在几秒钟内获得持续时间并添加它们:
select
product_id,
sum(timestampdiff(second, greatest(date_add, date '2018-04-01'),
least(date_remove, date '2018-04-06'))
) / 60 / 60 / 24 as days
from storage
where date_add < date '2018-04-06' and date_remove >= date '2018-04-01'
group by product_id
order by product_id;
这会让你
product_id | days -----------+--------------- 10 | 5,599872685185 12 | 2,036400462963
在结果日期内随意使用FLOOR
,CEIL
或ROUND
。
Rextester演示:http://rextester.com/XTVU47656
答案 1 :(得分:0)
要获得此类结果,请尝试
SELECT SUM(DATEDIFF(date_remove, date_add)) as days
FROM table
GROUP BY product_id
请注意,这会将相同product_id
的所有日期相加。要获得每个id
的结果,请使用:
SELECT id, product_id, DATEDIFF(date_remove, date_add) as days
FROM table