Миллион способов сделать это, в большинстве моих систем у меня есть таблица измерения даты, используемая для отчетов и других различных вещей, которые я хочу отфильтровать по различным критериям даты. Вы можете легко построить такую таблицу, используя функции DATEPART & DATENAME в MSSQL.
Пример скрипта (это из моего старого кода):
-- =============================================
-- Build Dimension Date Table
-- =============================================
DECLARE @StartDate as smalldatetime, @EndDate as smalldatetime
SET @StartDate = '04/01/2010'
SET @EndDate = '03/31/2011'
BEGIN
SELECT
DATEPART(dy, @StartDate) as DAY_OF_YEAR,
CASE
WHEN DATENAME(qq,@StartDate)-1=0 THEN
4
ELSE
DATENAME(qq,@StartDate)-1
END AS FISCAL_PERIOD,
DATENAME(m,@StartDate) AS MONTH_DESC,
DATEPART(m,@StartDate) AS MONTH_NUM,
DATEPART(qq,@StartDate) AS QUARTER_NUM,
CONVERT(smalldatetime, CONVERT(CHAR(10),@StartDate,110)) AS SALES_DATE,
REPLACE(CONVERT(CHAR(10),@StartDate,06),' ','-') AS SALES_DATE_SPL,
DATEPART(yy,@StartDate) AS YEAR_NUM,
DATEPART(d,@StartDate) AS DAY_OF_MONTH,
CASE
WHEN DATEPART(m,@StartDate)< 4 THEN
DATENAME(yy,@StartDate)-1
ELSE
DATENAME(yy,@StartDate)
END AS FISCAL_YEAR,
CASE
WHEN DATEPART(m,@StartDate)>3 THEN
DATEPART(m,@StartDate)-3
ELSE
12-(3-DATEPART(m,@StartDate))
END AS FISCAL_MONTH
INTO OLAP_DATE_DIMENSION
SELECT @StartDate = @StartDate + 1
END
WHILE (@StartDate <= @EndDate)
BEGIN
BEGIN
INSERT INTO OLAP_DATE_DIMENSION SELECT
DATEPART(dy, @StartDate) as DAY_OF_YEAR,
CASE
WHEN DATENAME(qq,@StartDate)-1=0 THEN
4
ELSE
DATENAME(qq,@StartDate)-1
END AS FISCAL_PERIOD,
DATENAME(m,@StartDate) AS MONTH_DESC,
DATEPART(m,@StartDate) AS MONTH_NUM,
DATEPART(qq,@StartDate) AS QUARTER_NUM,
CONVERT(smalldatetime, CONVERT(CHAR(10),@StartDate,110)) AS SALES_DATE,
REPLACE(CONVERT(CHAR(10),@StartDate,06),' ','-') AS SALES_DATE_SPL,
DATEPART(yy,@StartDate) AS YEAR_NUM,
DATEPART(d,@StartDate) AS DAY_OF_MONTH,
CASE
WHEN DATEPART(m,@StartDate)< 4 THEN
DATENAME(yy,@StartDate)-1
ELSE
DATENAME(yy,@StartDate)
END AS FISCAL_YEAR,
CASE
WHEN DATEPART(m,@StartDate)>3 THEN
DATEPART(m,@StartDate)-3
ELSE
12-(3-DATEPART(m,@StartDate))
END AS FISCAL_MONTH
END
SELECT @StartDate = @StartDate + 1
END
После того, как вы получите необходимые данные (вероятно, загрузите 20 лет, 10 назад и 10 вперед), все, что вам нужно сделать, это выбрать нужные данные. Поскольку вы хотите текущий месяц назад, я бы сделал запрос для всего с ГОДОМ / МЕСЯЦОМ <= СЕГОДНЯ и> = ДОЛГОСРОЧНАЯ ДАТА РАЗРЕШЕНА.
Пример:
SELECT *
FROM OLAP_DATE_DIMENSION
WHERE SALES_DATE <= CONVERT(CHAR(10),GETDATE(),110))
AND DAY_OF_MONTH = '1'
ORDER BY SALES_DATE DESC;
** Этот запрос к приведенной выше таблице (что, вероятно, является слишком большим для того, что вам нужно) возвращает первый день каждого месяца каждого месяца в таблице до сегодняшнего дня. Затем вы можете взять различные части даты, чтобы создать красивую метку для отображения в вашем списке (например, март 2010, февраль 2010, январь 2010 и т. Д.).
Надеюсь, это имеет смысл, единственной долгосрочной задачей "обслуживания" будет обновление таблицы с добавлением данных за годы. Поскольку это всего 365 дней в год, вы действительно можете загрузить тонну данных с минимальным влиянием на вашу систему. Если ваши страницы получают много просмотров, вы можете кэшировать результаты, чтобы данные были в памяти!