2013-02-11 3 views
0

привет, я хочу найти общие дни двух месяцев и разделить дни месяца на месяц ... например, 26-02-2013 до 3-3 -2013 здесь на февральский месяц он показывает 2 дня отпуска, но месяц марша, я не буду отображать общий отпуск .. это мой запрос .. кто-нибудь может исправить мой запрос..и показывает только дни только для часов, дни марша здесь не показаны ..как разделить количество дней в месяц между двумя месяцами

SELECT month(fdate) as Month_Number 
     , datename(month, fdate) as Month 
     , case when month(fdate) <> month(tdate) then 
      datediff(day, fdate, DATEADD(month, ((YEAR(fdate) - 1900) * 12) + MONTH(fdate), -1)) 
      else 
      datediff(day, fdate, tdate) 
      end as Leaves 
from test 
where empid like '112' 
+0

PLS вы могли бы немного подробнее рассказать о том, как выглядят данные и какой результат вы ожидаете. – SQLGuru

+0

Можете ли вы опубликовать некоторые тестовые данные и инструкции DML вместе с ожидаемым выходом? –

ответ

0

Попробуйте это, он будет отображать количество дней для каждого месяца:

SELECT * 
     , DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH, 0, t.fdate) + 1, 0)) Last_In_Month_Of_Beginning 
     , DATEADD(MONTH, DATEDIFF(MONTH, 0, t.tdate), 0) First_In_Month_Of_End 
INTO #temp1 
FROM test t 
WHERE empid LIKE '112' 

SELECT number Month_Number 
     , CASE 
      WHEN MONTH(fdate) = MONTH(tdate) THEN DATEDIFF(DAY, fdate, tdate) - 1 
      WHEN MONTH(Last_In_Month_Of_Beginning) = number THEN DATEDIFF(DAY, fdate, Last_In_Month_Of_Beginning) 
      WHEN MONTH(First_In_Month_Of_End) = number THEN DATEDIFF(DAY, First_In_Month_Of_End, tdate) 
      END Leave 
INTO #temp2 
FROM #temp1 a 
JOIN master..spt_values v ON 
     v.type = 'P' 
AND  v.number BETWEEN MONTH(a.Last_In_Month_Of_Beginning) AND MONTH(a.First_In_Month_Of_End) 

SELECT Month_Number 
     , SUM(Leave) Leaves 
FROM #temp2 
GROUP BY Month_Number 

Вот SQL Fiddle

Смежные вопросы