我需要计算多个日期范围之间的实际天数。
例如:
- 2014-01-01至2014-01-04为4天
- 2014-01-05至2014-01-06为期2天
,而
- 2014-02-01至2014-02-03 3天 与
- 2014-02-03至2014-02-05 3天
总共5天
另外一个复杂因素是,在一个月内,日期范围与重叠日期范围之间会有一些差距需要考虑
任何想法的家伙。 使用mysql进行计算的能力会很棒。
也许我应该说计算天数而不是计算。 我可以使用mysql或javascript获取两个日期范围之间的天数,如下所述,我认为我的车轮正在重叠日期范围,其中一个范围在另一个范围开始之前开始。
答案 0 :(得分:1)
根据建议HERE: 您可以在Javascript中使用Date对象:
var prevTime = new Date(2011,1,1,0,0); // Feb 1, 2011
var thisTime = new Date(); // now
var diff = thisTime.getTime() - prevTime.getTime(); // now - Feb 1
alert(diff / (1000*60*60*24)); // positive number of days
编辑:我错过了你标记的JavaScript,但是要求MySQL
根据建议HERE: 如果您对列使用DATE或DATETIME格式,则可以使用:
SELECT DATEDIFF(STR_TO_DATE('2014-01-01', '%Y-%m-%d'),STR_TO_DATE('2014-01-04', '%Y-%m-%d')) AS DAYS
希望有所帮助
EDIT2这是一个很好的方法,可以用一些逻辑在一个语句中完成:
SELECT (CASE
WHEN Start_date1 <= End_date2 THEN
1+DATEDIFF(End_date2, Start_date1)
WHEN Start_date2 <= End_date1 THEN
1+DATEDIFF(End_date1, Start_date2)
ELSE 0
END) AS DAYS
FROM TABLE
逻辑是: Date1在Date2结束之前开始,Start_date1&gt; = End_date2
OR
Date2在Date1结束之前开始,Start_date2&gt; = End_date1
如果两者都不成立,则不会重叠。
答案 1 :(得分:0)
这一小段SQL请求代码可能会帮助您入门。它使用DATEDIFF():
SELECT 1+DATEDIFF(MAX(end_date), MIN(start_date)) AS duration_in_days, event_id
FROM event_table
GROUP BY event_id
这里发生了什么?
首先,您已经说过8月21日至8月22日至8月14日的范围是2天,但是DATEDIFF将其计算为1.所以我们需要添加1。
其次,GROUP BY
此处将聚合同一事件的多个日期范围(如果有)。我不知道你是否在使用活动;你没说。这里的要点是展示如何聚合这些日期。
第三,如果您的个别日期范围不重叠,则此查询将无法正常运行。例如,假设您有这两个日期范围
21-Aug-14 to 22-Aug-14
27-Aug-14 to 28-Aug-14
此查询将提供合计范围21-Aug-14至28-Aug-14,即8天。但是你可能想省略8月23日至8月26日的差距,只报告4天。此查询不会这样做。