Sql 如何获取一年中每个月的第n个日期

Sql 如何获取一年中每个月的第n个日期,sql,sql-server-2005,Sql,Sql Server 2005,如何得到每个月的第n个日期,如果是星期天,那么下一个直接日期是一年的n+1。 例如: Year=2014 nth value = 2(2nd of each month) Date: 2014-01-02 2014-02-03 (since 02 is "Sunday" next Immediate date) 2014-03-03 (since 02 is "Sunday" next Immediate date) 2014-04-02 2014-05-02 2014-06

如何得到每个月的第n个日期,如果是星期天,那么下一个直接日期是一年的n+1。 例如:

 Year=2014
 nth value = 2(2nd of each month)

 Date:
 2014-01-02
 2014-02-03 (since 02 is "Sunday" next Immediate date)
 2014-03-03 (since 02 is "Sunday" next Immediate date)
 2014-04-02
 2014-05-02
 2014-06-02
 2014-07-02 
 and so on...
这个怎么样,

将处理介于“01”和“28”之间的日值,我已将参数检查和转换留给OP

DECLARE @Year = Char(4);
DECLARE @Day = VarChar(2);

SET @Year = '2014';
SET @Day = '2';

SELECT
    CASE DATENAME(dw, [Date])
        WHEN 'Sunday' THEN DATEADD(d, 1, [Date])
        ELSE [Date]
    END [Date]
  FROM (
    SELECT
        CAST(@Year + '-' + [M] + '-' + @Day AS DATETIME) [Date]
      FROM (
          SELECT '1' [M] UNION ALL
          SELECT '2' UNION ALL
          SELECT '3' UNION ALL
          SELECT '4' UNION ALL
          SELECT '5' UNION ALL
          SELECT '6' UNION ALL
          SELECT '7' UNION ALL
          SELECT '8' UNION ALL
          SELECT '9' UNION ALL
          SELECT '10' UNION ALL
          SELECT '11' UNION ALL
          SELECT '12') [Months]) [RawDays];
这对我有用

    Declare @Tracker int
    set @Tracker = 2

    Declare @FromDate datetime
    Declare @ToDate datetime
    set @FromDate = '2014-01-01'
    set @ToDate = '2014-12-31'

    Declare @TrackerTable Table ( Date Datetime)

    ;with DateDifference As
    (
         SELECT @FromDate DateValue
         UNION ALL
         SELECT  DateValue + 1
         FROM    DateDifference   
         WHERE   DateValue + 1 < @ToDate
    )

    Insert into @TrackerTable
        Select 
            Case 
                when datename(dw,DateValue) = 'Sunday' Then DateValue + 1 
                Else DateValue 
                End as Date
            from DateDifference where Day(DateValue) = @Tracker
            OPTION (MAXRECURSION 0) 

    Select * from @TrackerTable

阅读此答案,自己试一试,您希望如何处理月底的值,例如28如果2月底是星期天,+所有值>28将是边缘情况?如果这一天是月的最后一天,并且是星期天,您是否应该滚动到第一天?如果这一天是31,有些月份没有31号?@Jodrell如果这一天是一个月的最后一天,而且是星期天,你应该换到第一天吗?不,它应该设置下一个日期,即下个月的1号。脚本应该在sql server上运行2005@user1069940现在修好了。如果不起作用,请告诉我错误。请检查2014-02-02是星期天,但2014-02-03仍然显示的位置更改为:DATEPARTdw,[日期]更改为datenamedw,此时“星期天”工作正常。@user1069940,我已更改为使用DATENAME这避免了对一周的第一天是什么时候的混淆。