如何获得期间的天数?

时间:2018-04-04 08:43:16

标签: mysql sql

存储表

| 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

http://rextester.com/QFS96125

结果9,646805555556但可能最长5天且product_id 13正确0,436608796296但结果为0,87

2 个答案:

答案 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

在结果日期内随意使用FLOORCEILROUND

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