На сервере sql, как получить весь месяц и год с заданной даты

Я хочу отобразить все имена месяцев, номер месяца и год в запросе.

Предположим, что моя данная дата

@date=’ 01.03.2003’

Мой желаемый результат ниже:

введите здесь описание изображения

Помогите мне исправить мой синтаксис My bellow sql.

DECLARE @Date DATE = '2003-03-01',
        @inc INT = 0
;with cte as
(
    select 
    @inc AS Inc,
    DATENAME(mm,@Date) AS [MonthName],
    DATEPART(mm,@Date) AS [MonthNumber],
    DATEPART(yy,@Date) as [MonthYear]
    UNION ALL
    select
     inc+1,
     DATENAME(mm,DATEADD(mm,inc+1,@Date)),
     DATEPART(mm,DATEADD(mm,inc+1,@Date)),
     DATEPART(yy,@date) 
    FROM cte
    where inc < 12
)
select [MonthName],[MonthNumber],[MonthYear] from cte

Если у вас есть какие-либо вопросы, пожалуйста, спросите, любые предложения будут приемлемы. Заранее спасибо.


person shamim    schedule 26.01.2014    source источник


Ответы (2)


Как это?

DECLARE @Date DATE = '2003-03-01',
        @inc INT = 0
;with cte as
(
    SELECT Inc              = @inc                 
          ,[MonthName]      = DATENAME(mm ,@Date)  
          ,[MonthNumber]    = DATEPART(mm ,@Date)  
          ,[MonthYear]      = DATEPART(yy ,@Date)  
    UNION ALL
    SELECT inc + 1
          ,DATENAME(mm ,DATEADD(mm ,inc + 1 ,@Date))
          ,DATEPART(mm ,DATEADD(mm ,inc + 1 ,@Date))
          ,CASE WHEN [MonthNumber] = 12 THEN [MonthYear] + 1 ELSE [MonthYear] END
    FROM    cte
    WHERE  inc < 12
)
select [MonthName],[MonthNumber],[MonthYear] from cte

Однако это может быть более простой шаблон;

DECLARE @Date DATE = '2003-03-01'
;WITH MoreSimple as
(
    SELECT   [MonthName]    = DATENAME(mm ,@Date)  
            ,[MonthNumber]  = DATEPART(mm ,@Date)  
            ,[MonthYear]    = DATEPART(yy ,@Date) 
            ,NextRow        = DATEADD(MONTH, 1, @Date) 
    UNION ALL
    SELECT   DATENAME(mm ,NextRow)
            ,DATEPART(mm ,NextRow)
            ,DATEPART(yy ,NextRow)
            ,DATEADD(MONTH, 1, NextRow)
    FROM    MoreSimple
)
SELECT   TOP(100)
         [MonthName]
        ,[MonthNumber]
        ,[MonthYear] 
FROM MoreSimple
OPTION(MAXRECURSION 0)


----------
person MarkD    schedule 26.01.2014

Ваше выражение для получения года использует только исходную дату. Вместо этого используйте результат dateadd():

DECLARE @Date DATE = '2003-03-01',
        @inc INT = 0
;with cte as
(
    select 
    @inc AS Inc,
    DATENAME(mm,@Date) AS [MonthName],
    DATEPART(mm,@Date) AS [MonthNumber],
    DATEPART(yy,@Date) as [MonthYear]
    UNION ALL
    select
     inc+1,
     DATENAME(mm,DATEADD(mm,inc+1,@Date)),
     DATEPART(mm,DATEADD(mm,inc+1,@Date)),
     DATEPART(yy, DATEADD(mm,inc+1,@Date)) 
    FROM cte
    where inc < 12
)
select [MonthName],[MonthNumber],[MonthYear] from cte
person Gordon Linoff    schedule 26.01.2014
comment
Гордон Линофф, спасибо за ответ, я также хочу получить дату начала месяца, дату окончания, дату окончания. - person shamim; 26.01.2014