计算一系列日期范围的实际天数

时间:2014-09-06 12:55:26

标签: javascript jquery mysql

我需要计算多个日期范围之间的实际天数。

例如:

  
      
  • 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获取两个日期范围之间的天数,如下所述,我认为我的车轮正在重叠日期范围,其中一个范围在另一个范围开始之前开始。

2 个答案:

答案 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天。此查询不会这样做。