Получить первую дату каждого месяца SQL Server 2008 R2 - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно генерировать первую дату каждого месяца, начиная с 01.01.2000 по 31.12.2099.

Проблема: приведенный ниже запрос работает в Management Studio. Тем не менее, это не работает в SSRS. К сожалению, я не могу создать функцию или представление, потому что у меня нет доступа для этого.

Есть ли альтернативный способ написания этого запроса, который бы работал с SSRS? SSRS не любит использование «TOP» в моем запросе.

Ошибка, связанная с "TOP": Предложение TOP или FETCH содержит недопустимое значение.

declare @pStartDate date = '01/01/2000'
declare @pEndDate date   = '12/31/2099'

;With months(DATE, MONTH, YEAR)
as(
    SELECT TOP (DATEDIFF(MONTH, @pStartDate, @pEndDate)+1) 
        TheDate  = DATEADD(MONTH, number, @pStartDate),
        TheMonth = MONTH(DATEADD(MONTH, number, @pStartDate)),
        TheYear  = YEAR(DATEADD(MONTH, number, @pStartDate))
    FROM [master].dbo.spt_values 
    WHERE [type] = N'P' ORDER BY number
)
select cast(DATE as Date) as Date from months

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Попробуйте этот простой рекурсивный CTE, чтобы получить то, что вы хотите:

declare @pStartDate date = '01/01/2000'
declare @pEndDate date   = '12/31/2099'

;with FirstDayOfMonth as(
    select @pStartDate as [firstDayOfMonth]
    union all
    select DATEADD(month, 1, [firstDayOfMonth]) from FirstDayOfMonth
    where DATEADD(month, 1, [firstDayOfMonth]) < @pEndDate
)

select * from FirstDayOfMonth
option (maxrecursion 0)
0 голосов
/ 10 мая 2018

Я просто перестроил ваш код проще и эффективнее, без TOP предложения:

declare @pStartDate date = '01/01/2000'
declare @pEndDate date   = '12/31/2099'    

SELECT DATEADD(MONTH, number, @pStartDate) as Date 
FROM [master].dbo.spt_values 
  WHERE [type] = N'P' 
  AND number < DATEDIFF(MONTH, @pStartDate, @pEndDate)+1
  ORDER BY number 

Когда вы добавляете один месяц к дате, он сохраняет день. 30 и 31 день - особые случаи, попробуйте сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...