获取每个月的第一个日期 SQL Server 2008 R2

Posted

技术标签:

【中文标题】获取每个月的第一个日期 SQL Server 2008 R2【英文标题】:Get first date of each month SQL Server 2008 R2 【发布时间】:2018-05-09 22:15:41 【问题描述】:

我需要生成每个月的第一个日期,从 2000 年 1 月 1 日到 2099 年 12 月 31 日。

问题:以下查询在 Management Studio 中有效。但是,它在 s-s-rS 中不起作用。不幸的是,我无法创建函数或视图,因为我无权这样做。

是否有另一种方法可以编写适用于 s-s-rS 的查询? s-s-rS 不喜欢在我的查询中使用“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生成日历表的方法有很多@ PSA:ISO date format. @Nick.McDermaid 补充说:TOP 或 FETCH 子句包含无效值。 【参考方案1】:

我只是以更简单有效的方式重新排列了您的代码,没有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 天是特殊情况,请自行尝试。

【讨论】:

【参考方案2】:

试试这个简单的递归 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)

【讨论】:

啊!当我尝试使用递归作为替代查询时,我错过了“option (maxrecursion 0)”。

以上是关于获取每个月的第一个日期 SQL Server 2008 R2的主要内容,如果未能解决你的问题,请参考以下文章

SQL server如何获取给定月的倒数数第二天

如何在n个月内使用sql(无程序)获取每个月的第一天和最后一天

如何获取每个月的第二个星期五的日期范围?

Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期

如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

如何在 DB2 中获取每个月的当前最后一天