четверг, 28 марта 2013 г.

Как получить выборку за последние N полных месяцев по заказам, проектам, курсам, операциям



-- Как получить выборку за последние N полных месяцев по заказам, проектам, курсам, операциям
-- Пример: Как получить выборку по заказам за последние 12 полных месяцев

-- Будем считать что сегодня 13.02.2008 (для корректной работы AdventureWorks)

DECLARE @Today AS DATETIME = '2008-04-01'
-- Посчитаем месяц и год 12 месяцев назад

DECLARE @FirstMonth INT = MONTH(DATEADD(MONTH, -12, @Today))
DECLARE @FirstYear INT = YEAR(DATEADD(MONTH, -12, @Today))

-- Проверим
SELECT
     @FirstMonth AS Month
    , @FirstYear AS Year

--- Вычислим первую дату периода
DECLARE @FirstDate AS DATETIME
DECLARE @LastDate AS DATETIME

-- Вариант предпочтительный SQL Server >= 2012
SET @FirstDate = DATEFROMPARTS(@FirstYear, @FirstMonth, 1)
SET @LastDate = EOMONTH(@Today, -1)

-- Проверим
SELECT
    @FirstDate AS FirstDate
    ,@LastDate AS LastDate

-- Вариант для всех версий
SET @FirstDate = CAST
    (
         CAST(@FirstYear AS CHAR(4)) +'-'+
         + CAST(@FirstMonth AS CHAR(2)) + '-' + '01'
          AS DATETIME
    )
SET @LastDate = CAST
    (
         CAST(YEAR(@Today) AS CHAR(4)) +'-'+
         + CAST(MONTH(@Today) AS CHAR(2)) + '-' + '01'
          AS DATETIME
    )
SET @LastDate = DATEADD(DAY,-1,@LastDate)

-- Проверим
SELECT
    @FirstDate AS FirstDate
    ,@LastDate AS LastDate

-- Отберем заказы
SELECT
    *
FROM AdventureWorks2012.Sales.SalesOrderHeader
WHERE      
         DATEDIFF(DAY, @FirstDate, OrderDate) >= 0
         AND DATEDIFF(DAY, OrderDate, @LastDate) >= 0
ORDER BY OrderDate