Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

podziel zakres dat na miesiące

Poniższe zapytanie powinno załatwić sprawę. CTE (WITH klauzula) dynamicznie generuje dane Miesiące, do których możemy się przyłączyć.

declare @test table (
    userid char(1),
    project char(4),
    startdate datetime,
    enddate datetime)

insert into @test
select 'A', 'abc1', '1/1/2011', '12/31/2011'
union select 'A', 'abc2', '1/1/2011', '5/1/2011'
union select 'B', 'xyz1', '1/1/2011', '3/1/2011'

--select * from @test

;with MonthList as (
    select 
        DATEADD(month, M, '12/1/1899') as 'FirstDay',
        dateadd(day, -1, dateadd(month, M + 1, '12/1/1899')) as 'LastDay',
        DATEADD(month, M + 1, '12/1/1899') as 'FirstDayNextMonth'
    from (
        select top 3000 ROW_NUMBER() over (order by s.name) as 'M'
        from master..spt_values s) s
)

select
    t.userid, t.project, ml.FirstDay, ml.LastDay
from
    @test t
    inner join MonthList ml
        on  t.startdate < ml.FirstDayNextMonth
            and t.enddate >= ml.FirstDay


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyłącz wszystkie indeksy nieklastrowane

  2. Kod utrzymuje limit czasu

  3. Naucz się projektowania baz danych w SQL Server Management Studio (SSMS) — część 2

  4. Dlaczego w SQL Server NULL nie równa się pustemu ciągowi ORAZ nie równa się pustemu ciągowi?

  5. Pobierz obraz z bazy danych w asp.net