2013-02-11 124 views
0

嗨我想找到两个月的总天数和拆分明智的月份的日期..例如... 26-02-2013至3-3 -2013 这里为2月份它显示2天离开,但3月我不会显示总假期..这是我的查询..任何人都可以纠正我的查询..只显示febraury天,只有febraury天,三月天没有显示在这里..如何拆分两个月之间的月份的天数

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

请你能详细说一点,也许给一个数据的样子和你期待的结果的样本。 – SQLGuru 2013-02-11 09:44:47

+0

您可以发布一些测试数据和DML语句以及预期输出吗? – 2013-02-11 09:45:47

回答

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