Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Премахнете и намалете припокриващите се периоди от време

За SQL Server 2005+

-- sample table with data
declare @t table(UserID int, StartDate datetime, EndDate datetime)
insert @t select
1, '20110101', '20110102' union all select
1, '20110101', '20110110' union all select
1, '20110108', '20110215' union all select
1, '20110220', '20110310' union all select
2, '20110101', '20110120' union all select
2, '20110115', '20110125'

-- your query starts below

select UserID, Min(NewStartDate) StartDate, MAX(enddate) EndDate
from
(
    select *,
        NewStartDate = t.startdate+v.number,
        NewStartDateGroup =
            dateadd(d,
                    1- DENSE_RANK() over (partition by UserID order by t.startdate+v.number),
                    t.startdate+v.number)
    from @t t
    inner join master..spt_values v
      on v.type='P' and v.number <= DATEDIFF(d, startdate, EndDate)
) X
group by UserID, NewStartDateGroup
order by UserID, StartDate

Бележки:

  1. Заменете @t с името на вашата таблица



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-ефективният начин в SQL Server за получаване на дата от дата+час?

  2. Актуализиране на пощенски акаунт в база данни в SQL Server (T-SQL)

  3. Как да предадете параметър на mssql заявка в възел js

  4. Инструмент за възстановяване на резервно копие на SQL за поправяне на повредено архивиране на SQL - Преглед на продукта - Публикация на гост от Даниел Джоунс

  5. получавате разделен със запетая низ от редове