Miss R Ответов: 3

SQL выберите предыдущие 12 месяцев на основе даты


Я пытаюсь получить список предыдущих 12 месяцев с любым вводом даты в формате varchar so (201404 будет апрель 2014 года) и верну список всех месяцев до 201305 года.
На данный момент у меня есть следующее, Но это приносит следующие 12 месяцев, мне нужны предыдущие 12 месяцев в формате 201404.

DECLARE @Today DATETIME 
  , @nMonths TINYINT
SET @Today = GETDATE()
SET @nMonths = 12

SELECT   SUBSTRING(
			DATENAME(MONTH, DATEADD(dd, -1, DATEADD(month, n.n + DATEDIFF(month, 0, @Today), 0))), 1, 3) 
			+ CAST(YEAR(DATEADD(dd, -1, DATEADD(month , n.n + DATEDIFF(month, 0, @Today) -1 , 0))) AS VARCHAR(4))
		AS EndDateOP
FROM    ( SELECT TOP ( @nMonths )n = ROW_NUMBER() OVER ( ORDER BY NAME )
          FROM      master.dbo.syscolumns ) n
ORDER BY 1 DESC

F-ES Sitecore

Если вы хотите вычесть месяцы, то добавьте -12

Miss R

Где и зачем нам это делать?

jaket-cp

вы можете поиграть с @сегодня.
SET @Today = DATEADD(month, -12, GETDATE())

Miss R

Спасибо. Все работает нормально, но январь должен быть Янв2015, но он выбрасывает Янв2014. Как это исправить?

3 Ответов

Рейтинг:
2

sandeepmittal11

DECLARE @Today DATETIME, @nMonths TINYINT
SET @nMonths = 12
SET @Today = GETDATE()
 
SELECT	RIGHT(CONVERT(VARCHAR,DATEADD(MM, -1*number, @Today),106),8)
FROM	master.dbo.spt_values
WHERE TYPE = 'P' and number between 1 and @nMonths


Рейтинг:
1

Chandrashekhar Amge

DECLARE @Today DATETIME 
  , @nMONTHs TINYINT, @LinNum int = 100
SET @Today = DATEADD(MONTH, -12, GETDATE())
SET @nMONTHs = 12

SELECT
	n.n ID,
	DATENAME(MONTH, DATEADD(dd, -(DAY(GETDATE())+1), DATEADD(MONTH, n.n + DATEDIFF(MONTH, 0, @Today), 0))) + ' '
	+ CAST(YEAR(DATEADD(dd, -(DAY(GETDATE())+1), DATEADD(MONTH , n.n + DATEDIFF(MONTH, 0, @Today) , 0))) AS VARCHAR(4))	Name
FROM    ( SELECT TOP ( @nMONTHs )n = ROW_NUMBER() OVER ( ORDER BY NAME )
          FROM      master.dbo.syscolumns ) n
ORDER BY n.n


Рейтинг:
0

CHill60

Проблема в том, что

+ CAST(YEAR(DATEADD(dd, -1, DATEADD(month , n.n + DATEDIFF(month, 0, @Today) -1 , 0))) AS VARCHAR(4))
- видишь ли ... -1 .. вы смотрите на год предыдущего месяца в последовательности - это должно быть
+ CAST(YEAR(DATEADD(dd, -1, DATEADD(month , n.n + DATEDIFF(month, 0, @Today), 0))) AS VARCHAR(4))

Вот еще одна альтернатива для генерации той же последовательности - она будет немного более производительной, так как происходит меньше форматирования
DECLARE @Today DATETIME, @nMonths TINYINT
SET @nMonths = 12
SET @Today = DATEADD(month, (-1) * @nMonths, GETDATE())

;WITH q AS
(
	SELECT  @Today AS datum
	UNION ALL
	SELECT  DATEADD(month, 1, datum) 
	FROM q WHERE datum + 1 < GETDATE()
)
SELECT  SUBSTRING(DATENAME(MONTH, datum), 1, 3) + CAST(YEAR(datum) AS VARCHAR(4))
FROM q
взято из работы Манаса в Генерация последовательности в SQL[^]