2014-09-06 50 views
4

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

例如:

  • 2014年1月1日至2014年1月4日是4天
  • 2014年1月5日到2014年1月6日为2天

  • 2014年2月1日到2014年2月3日3天 与
  • 2014年2月3日到2014-02-053天

是总共5天

另外一个复杂的情况是,在一个月内,日期范围和/或重叠日期范围之间会有一些差距需要考虑。

任何想法家伙。 使用mysql做calc的能力会很好。

也许我应该说数天数而不是计算。 我可以使用mysql或javascript来获取两个日期范围之间的天数,如下所述,我认为我的轮子正在重叠的日期范围内,其中一个范围在另一个范围开始之前已经完成。

+2

请编辑问题并显示数据库中数据的格式。样本数据和期望的结果确实有帮助,至少在涉及SQL的问题上。 – 2014-09-06 13:04:41

+0

我可能会通过构建一个“所有可能的日期”表(具有一些限制启发式将会有所帮助),然后在该表和每个范围之间进行外连接,过滤那些没有匹配连接的记录并计算结果。 – eggyal 2014-09-06 13:12:23

+0

听起来好像你正在计算由可能重叠的开始/结束日期对集合定义的日期范围的总体持续时间。那是对的吗? – 2014-09-06 14:39:27

回答

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 

Hope帮助

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 

的逻辑是: 日期1开始日期2结束前,Start_date1> = End_date2

OR

Date2在Date1结束之前开始,Start_date2> = End_date1

如果两者都不成立,它们不会重叠。

+0

看看这个[链接](http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap )我基本上试图得到这个正确的,但具有多个值 – 2014-09-06 13:52:19

+0

您可以使用此逻辑:'(StartDate1 <= EndDate2)和(EndDate1> = StartDate2)' 或这里建议的东西:http://stackoverflow.com/questions/117962 /最简单高效的方式来查找行与时间间隔重叠在SQL虽然该链接表明你正在比较一个表到另一个表,并返回重叠,你可以很容易地适应它。 – 2014-09-06 14:00:46

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 

这是怎么回事?

首先,你已经说过,范围21-Aug-14到22-Aug-14是2天,但DATEDIFF计算它为1.所以我们需要给它加1。

其次,GROUP BY这里将聚合多个日期范围,如果有的话,为同一个事件。我不知道你是否在使用事件;你没有说。这里的重点是展示如何汇总这些日期。

第三,如果您的各个日期范围不重叠,则此查询将无法正常工作。例如,假设你有这两个日期范围

21-Aug-14 to 22-Aug-14 
27-Aug-14 to 28-Aug-14 

此查询将拿出总范围21 - 8 - 14到8月28日 - 14日,这是八天。但是您可能想要忽略差距,8月23日至8月26日,只报告4天。这个查询不会那样做。