我有一个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特权答案 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