2014-09-16 3 views
0
declare @start_date as datetime = '12/31/2014' 
declare @end_date as datetime = '02/15/2015' 

;with cte as (
    select 
     datename(month,@start_date) as [mnth_nm], 
     month(@start_date) as [mnth_no], 
     @start_date as dat, 
     DATEADD(DAY, -1 * DAY(@start_date) + 1, @start_date) as [first_day], 
     DATEADD(dd, -DAY(DATEADD(mm, 1, @start_date)), DATEADD(mm, 1, @start_date)) as [last_day] 
    union all 
    select 
     datename(month, DateAdd(Month, 1, dat)), 
     month(dat) + 1 as [mnth_no], 
     DateAdd(Month, 1, dat), 
     DATEADD(MONTH, 1, [first_day]), 
     DATEADD(dd, -DAY(DATEADD(mm, 1, dat)), 
     DATEADD(mm, 1, dat)) + 1 
    from 
     cte 
    where 
     DateAdd(Month,1,dat) < @end_date 
) 
select 
    [mnth_nm], [mnth_no], @start_date, [first_day], [last_day] 
from 
    CTE 

В приведенном выше КТР требуемый результат должен давать выходные данные за декабрь, январь и февраль в зависимости от даты начала и окончания.Рассчитать номер месяца, имя месяца, первый день месяца (дату) и последний день месяца (дату), используя общее выражение таблицы в sql-сервере?

+0

Добро пожаловать в StackOverflow: если вы разместите код, XML или данных образцов, пожалуйста ** * * выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

+0

Sure Marc благодарит за редактирование ... – Badal

+0

Почему это помечено как для Oracle, так и для SQL Server (и двух разных версий SQL Server)? Код выглядит как T-SQL, поэтому я бы предположил, что тег Oracle должен быть удален. –

ответ

0

Изменение только когда запрос: -

DateAdd (месяц, 0, Дат) < @end_date

+0

Для «Января» его месячный номер 13 должен быть 1. и последний день для января и февраля неверен. Можете ли вы проверить. – Badal

0
<b>Got the solution ... </b> 
<p> 
declare @start_date as datetime = '12/31/2014' 
declare @end_date as datetime = '03/15/2015' 

;with cte as (
    select 
     datename(month,@start_date) as [mnth_nm], 
     month(@start_date) as [mnth_no], 
     @start_date as dat, 
     DATEADD(DAY, -1 * DAY(@start_date) + 1, @start_date) as [first_day], 
     DATEADD(dd, -DAY(DATEADD(mm, 1, @start_date)), DATEADD(mm, 1, @start_date)) as [last_day] 
    union All 
    select 
     datename(month, DateAdd(Month, 1, dat)), 
     month(DateAdd(m,1,dat)) as [mnth_no], 
     DateAdd(Month, 1, dat), 
     DATEADD(MONTH, 1, [first_day]), 
DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, DATEADD(MONTH, 1, [first_day])) + 1, 0)) 
    from 
     cte 
    where 
    DateAdd(Month,0,dat)< @end_date 
) 
select 
    [mnth_nm], [mnth_no], @start_date, [first_day], [last_day] 
from 
    CTE</p> 
Смежные вопросы