sql >> データベース >  >> RDS >> Sqlserver

日付範囲を月に分割する

    次のクエリでうまくいくはずです。 CTE (WITH 節) は、結合に使用できるいくつかの月データを動的に生成します。

    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. PythonでSQLIN句を文字列形式にする方法

    2. MaxmindGeolitecityデータベースでのIPアドレス表現

    3. OracleクエリでのHTMLデータの処理

    4. group_concatの値がnullの行は返されません