计算一个月查询的平均工作时间,但当月的逻辑不同?

时间:2017-05-05 08:56:09

标签: sql sql-server

我有一个Employee_Attendance表,其中包含以下字段:

日期,班次,IN,OUT,延迟,早出,假日,工作时间

样本数据为

Date           IN       OUT     Late_In    Early_Out    Holiday    Workhour
--------------------------------------------------------------------------------
01-04-2017     09:04    17:58     00:04        :            :       08:54
02-04-2017     08:41    17:25       :        00:05          :       08:44

我使用以下查询根据一个月内的工作天数查找工作时间的平均值

SELECT
    ISNULL(cast(SUM(DateDiff(MINUTE,  CAST('0:00' as time), WORKHOUR))/60 as nvarchar(3)) + ':' + cast(SUM(DateDiff(MINUTE,  CAST('0:00' as time), WORKHOUR))%60 as nvarchar(2)),'-') AS TOTALWRKHRS,                                                                                                                                                                                        
    ISNULL(RIGHT('0' + cast((SUM(DateDiff(MINUTE,  CAST('0:00' as time), WORKHOUR))/"+workingdays+")/60 as nvarchar(3)), 2)  + ':' + RIGHT('0' + cast((SUM(DateDiff(MINUTE, CAST('0:00' as time), WORKHOUR))/"+workingdays+")%60 as nvarchar(2)) , 2),'-') AS AVGWRKHRSWRKHRS

FROM 
    "+currMonthVal+" m,"+currYearVal+" e 
WHERE 
    E.EMPID=M.EMPID AND 
    E.LOCATION=M.LOCATION AND M.EMPID = ?
    and (DATENAME(WEEKDAY, attdate) not IN ('Saturday', 'Sunday') or
    CONVERT(VARCHAR(10),ATTDATE,3) in ("+resultantWL+") ) and
    CONVERT(VARCHAR(10),ATTDATE,3) not in ("+resultantHL+")

其中

  • 工作日是我在另一个查询中计算的一个月的工作天数

  • currMonthVal 是从外部传递的当月缩写(例如JAN,FEB,March ..)

  • currYearVal 是从外部传递的当前年度值(例如2011,2012 ..)

  • resulWL 是从外部传递的额外工作日(例如13-04-2017)[此值实际上是从另一个查询中的表 - 'ExtraWorkingDays'获取的日期] < / p>

  • outcomeHL 是在[外部]传递的假日日期(例如05-04-2017,14-04-2017)[此值实际上是从表格中获取的日期或日期数组-'Admin_Holiday在另一个查询中]

现在 此查询工作正常,但它根据一个月的工作日数找到工作时间的平均值,我想要的是如果月份是当前月份,那么平均值应该根据到目前为止的天数,例如,如果月份是2017年5月,22个工作日,今天是05-05-2017,那么它应该通过取值5而不是22来计算工作时间的平均值,并且在以后的日期通过取值6而不是22来计算。数据/表在GUI上显示为动态表。

请告诉我在此查询中需要进行哪些更改。

此外,我在Employee_Attendance表

上只有SELECT特权

1 个答案:

答案 0 :(得分:0)

问题1:如果是当前月份和年份,那么找到平均工作时间,直到整个月为止

解决方案:

declare @month varchar(20)='JAN'
declare @year int=2017

declare @FromDate date=cast(@year as varchar)+'-'+@month+'-'+ '01'
declare @ToDate date

if(datepart(month,@FromDate)=datepart(month,getdate()) 
and datepart(year,@FromDate)=datepart(year,getdate()))
set @ToDate=getdate() -- till date
else
set @ToDate=DATEADD(day,-1, dateadd(month, datediff(month,0,@FromDate)+1,0))--last day month

select @ToDate

现在只需找到这些日期之间的记录。它将解决您的一个问题。

您是否维护每个月和每年的表格?在这种情况下,您的数据库设计是错误的。

但首先使用硬编码的月份和年份来查询您的查询,然后您可以将其转换为动态SQL