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

SQL Server 2005 で月に基づいて日付範囲を分割する方法

    CTE の使用:

    DECLARE @Begin DATETIME
    DECLARE @End DATETIME
    
    SELECT @Begin = '20110101', @End = '20120101'
    
    ;WITH ranges(DateFrom, DateTo) AS
    (
      SELECT @Begin, DATEADD(DAY, -1, DATEADD(MONTH, 1, @begin))
      UNION ALL
      SELECT DATEADD(month, 1, DateFrom), DATEADD(DAY, -1, DATEADD(MONTH, 2, DateFrom))
      FROM ranges
      WHERE DateFrom < @End
    )
    SELECT * FROM ranges
    OPTION(MAXRECURSION 0)
    

    そして CTE を使用していない:

    DECLARE @Begin DATETIME
    DECLARE @End DATETIME
    
    SELECT @Begin = '20110101', @End = '20120101'
    
    SELECT DATEADD(MONTH, n.Number, @Begin) DateFrom, DATEADD(day, -1, DATEADD(MONTH, n.Number+1, @Begin)) DateTo
    FROM master.dbo.spt_values n
    WHERE 
        n.Number < DATEDIFF(MONTH, @begin, @end)
    AND n.Type = 'P'
    

    2012 年 1 月も含める必要がある場合は、これを使用してください

    DECLARE @Begin DATETIME
    DECLARE @End DATETIME
    
    SELECT @Begin = '20110101', @End = '20120101'
    
    SELECT DATEADD(MONTH, n.Number, @Begin) DateFrom, DATEADD(day, -1, DATEADD(MONTH, n.Number+1, @Begin)) DateTo
    FROM master.dbo.spt_values n
    WHERE 
        n.Number <= DATEDIFF(MONTH, @begin, @end)
    AND n.Type = 'P'
    

    CTE:

    DECLARE @Begin DATETIME
    DECLARE @End DATETIME
    
    SELECT @Begin = '20110101', @End = '20120101'
    
    ;WITH ranges(DateFrom, DateTo) AS
    (
      SELECT @Begin, DATEADD(DAY, -1, DATEADD(MONTH, 1, @begin))
      UNION ALL
      SELECT DATEADD(month, 1, DateFrom), DATEADD(DAY, -1, DATEADD(MONTH, 2, DateFrom))
      FROM ranges
      WHERE DATEADD(month, 1, DateFrom) < @End
    )
    SELECT * FROM ranges
    OPTION(MAXRECURSION 0)
    


    1. 別のサーバーでmysqlに接続します

    2. MAMPMySQLがOSXでmy.cnf値を認識しない

    3. SQL Server 2008 インスタンス

    4. CONTINUE In Loopsを使用して、Oracleで制御を再開します