查询查找当前月份的第一天和最后一天,不包括sql中的星期日

时间:2016-12-14 05:38:36

标签: sql sql-server

我需要获取月度报告的数据,这些数据应该在所有周内排除星期日...我不能排除星期日。请检查以下查询:

select Name,Actual_Hours,round((Actual_Hours/((DATEDIFF(DAY,'12-01-2016'  ,'12-14-2016')+1)*8.5))*100,0)as percentage 
 from (select Name , SUM(actual_Hours) Actual_Hours  
 from ( select Name,ACTUAL_HOURS=sum(DATEPART(hh,[Time_Taken_in_Min]))+sum(DATEPART(MINUTE,[Time_Taken_in_Min])) /60  
 FROM [HR_Admin].[dbo].[Mst_Daily_Report_Pds]  where date between  '12-01-2016'  and  '12-14-2016' and (DATENAME(weekday,Date)) not in ('sunday') 
 GROUP BY  Name )o group by Name  )a order by Actual_Hours desc

1 个答案:

答案 0 :(得分:1)

不确切地知道您收到了什么错误但我没有在SQL中看到问题,但我相信它是因为在select查询中使用了DATEDIFF而不是使用实际的日子。

检查以下查询,该查询使用实际天数(已在Where子句中删除了星期日)并使用较少的子查询。您可以通过仅考虑最里面的查询中的时间因素,然后在将所有小时数相加后四舍五入来进一步改善这一点。

另一个建议是避免将列名用作Date之类的保留字,因为它可能会造成混淆,或者使用方括号中的列,例如[Date]

select Name
     , sum(Actual_Hours) as Actual_Hours
     , round((sum(Actual_Hours)/COUNT([Day])*8.5)*100,0) as percentage
  from (select Name
             , DATEPART(DAYOFYEAR,[Date]) as [Day]
             , ACTUAL_HOURS=sum(sum(DATEPART(hh,[Time_Taken_in_Min]))+sum(DATEPART(MINUTE,[Time_Taken_in_Min])) /60)
          FROM [HR_Admin].[dbo].[Mst_Daily_Report_Pds] 
         where date between '12-01-2016' and '12-14-2016' 
           and (DATENAME(weekday,[Date])) not in ('Sunday')
         GROUP BY Name, [Date]
     ) a 
 GROUP BY Name
 order by Actual_Hours desc