Php 从单个日期创建日期范围

Php 从单个日期创建日期范围,php,sql,sql-server,Php,Sql,Sql Server,我有一个数据库,其中包含单个日期,例如: date ---------- 2017-11-01 2017-11-02 2017-11-03 2017-11-04 2017-11-05 2017-11-06 2017-12-14 2017-12-15 2017-12-16 2017-12-17 2018-01-04 我需要一种使用PHP将这些值作为日期范围输出的方法。使用示例日期,我的预期结果如下: 2017-11-01 - 2017-11-06 2017-12-14 - 2017-12-17

我有一个数据库,其中包含单个日期,例如:

date
----------
2017-11-01
2017-11-02
2017-11-03
2017-11-04
2017-11-05
2017-11-06
2017-12-14
2017-12-15
2017-12-16
2017-12-17
2018-01-04
我需要一种使用PHP将这些值作为日期范围输出的方法。使用示例日期,我的预期结果如下:

2017-11-01 - 2017-11-06
2017-12-14 - 2017-12-17
2018-01-04 - 2018-01-04
以前有没有人这样做过,或者知道实现这一点的最佳方法


谢谢大家!

在MS-SQL中,这要简单得多。只需将差值与行号一起使用即可:

select min(date), max(date)
from (select date, row_number() over (order by date) as seqnum
      from t
     ) t
group by dateadd(day, - seqnum, date);
对于MySQL,正如问题最初标记的那样,最简单的方法是使用变量:

select min(date), max(date)
from (select t.*,
             (@grp := if(date = @d + interval 1 day,
                         if(@date := @d, @grp, @grp),
                         if(@date := @d, @grp + 1, @grp + 1)
                        )
             ) grp
      from (select date
            from t
            order by date
           ) t cross join
           (select @grp := 0, @d) params
     ) t
group by grp;

要在MS SQl中执行相同的操作,请尝试:

    WITH    dateTable
          AS (SELECT    CAST('2017-11-01' AS DATE) date
              UNION ALL
              SELECT    DATEADD(DAY, 3, date)
              FROM      dateTable
              WHERE     date < '2018-04-01'
             )
    SELECT  MIN(date)
    ,       MAX(date)
    FROM    dateTable
    GROUP BY DATEPART(YEAR, date)
    ,       DATEPART(MONTH, date)

假设您想要一年中每个月的第一个和最后一个日期。这里的公共表表达式仅用于获取一些测试数据,当您从自己的数据中选择时,可以忽略它。出于效率原因,通常应避免迭代cte。

通过使用窗口函数,我们还可以通过按月份划分的最小值和最大值来实现它

;WITH Cte([Date])
    AS
    (
    SELECT '2017-11-01' UNION ALL
    SELECT '2017-11-02' UNION ALL
    SELECT '2017-11-03' UNION ALL
    SELECT '2017-11-04' UNION ALL
    SELECT '2017-11-05' UNION ALL
    SELECT '2017-11-06' UNION ALL
    SELECT '2017-12-14' UNION ALL
    SELECT '2017-12-15' UNION ALL
    SELECT '2017-12-16' UNION ALL
    SELECT '2017-12-17' UNION ALL
    SELECT '2018-01-04' 

    )
    SELECT DISTINCT MIN([Date]) OVER(PARTITION BY DATEPART(MM,[Date]) ORDER BY (SELECT(NULL))) AS StartDate,
                    MAX([Date]) OVER(PARTITION BY DATEPART(MM,[Date]) ORDER BY (SELECT(NULL))) AS EndDate FROM Cte

日期总是有意义的吗?这会发生吗:11-01、11-02、11-05、11-06?这会改变答案,这就是为什么我问:是的。日期总是连续的。如果缺少日期,则应为以下日期创建新的日期范围。谢谢@MagnusAlexander如果错过了一个约会——这可能会带来很大的不同。见戈登的答案。“如果这不起作用,那么你需要让他知道你到底想在这里做什么。”MagnusAlexander最后一个问题,11-30,12-01,12-02怎么样。这是两个范围还是同一范围?归结到:月份的变化是否会创建一个新的组?我理解:如果日期是11-05、11-06、11-07、11-09、11-10、11-11,范围将是11-05-11-07和11-09-11-11。谢谢!我可以看出,这将在MySQL数据库上运行良好。然而,我在这个项目中使用的是基于MS SQL的数据库,我不知道如何为此重写代码。但是非常感谢你的回答@马格努萨莱桑德。你应该正确地标记你的问题。我知道,我很抱歉。我一看到就换了。诚实的错误@MagnusAlexander我一看到就换了不,你没有。sql!=mssql/sqlserver。