获取每个月的第一个日期 SQL Server 2008 R2
Get first date of each month SQL Server 2008 R2
我需要生成从 01/01/2000 到 12/31/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
我只是以更简单有效的方式重新安排了您的代码,没有 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天是特例,自己试试吧
试试这个简单的递归 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)
我需要生成从 01/01/2000 到 12/31/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
我只是以更简单有效的方式重新安排了您的代码,没有 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天是特例,自己试试吧
试试这个简单的递归 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)