2014-02-05 214 views
0

我已经写了这个查询来显示某个员工在特定日期(如果他来了)的总工作时间和加班时间。我希望如果某个特定日期的人的INtime和OutTime是空的,则在他的银泰,外出时间,总工作时间,加班时间等00:00放置。星期天显然没有InTime和OutTime,那么它应该在时间列中显示00:00。 注意:只有在提及InTIme的情况下才会输入日期,否则不会输入DateVisited。将数据添加到列

例如

EmplID EmplName ShiftID intime Outtime totalworking overtime dateVisited 
0000001 John  S001 00:00 00:00 00:00:  00:00  2013-12-01 

查询:

with times as (

SELECT t1.EmplID 

     , t3.EmplName 

     , min(t1.RecTime) AS InTime 

     , max(t2.RecTime) AS [TimeOut] 

     , t4.ShiftId as ShiftID 

     , t4.StAtdTime as ShStartTime 

     , t4.EndAtdTime as ShEndTime 

     , cast(min(t1.RecTime) as datetime) AS InTimeSub 

     , cast(max(t2.RecTime) as datetime) AS TimeOutSub 

     , t1.RecDate AS [DateVisited] 

FROM AtdRecord t1 

INNER JOIN 

     AtdRecord t2 

ON t1.EmplID = t2.EmplID 

AND t1.RecDate = t2.RecDate 

AND t1.RecTime < t2.RecTime 

inner join 

     HrEmployee t3 

ON t3.EmplID = t1.EmplID 

inner join AtdShiftSect t4 

ON t3.ShiftId = t4.ShiftId 

group by 

      t1.EmplID 

     , t3.EmplName 

     , t1.RecDate 

     , t4.ShiftId 

     , t4.StAtdTime 

     , t4.EndAtdTime 

) 
SELECT 

EmplID 

,EmplName 
,ShiftId As ShiftID 

,InTime 
,[TimeOut] 
,convert(char(5),cast([TimeOutSub] - InTimeSub as time), 108) TotalWorkingTime 

,[DateVisited] 
,CASE WHEN [InTime] IS NOT NULL AND [TimeOut] IS NOT NULL THEN 

    CONVERT(char(5),CASE WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime And ShiftID = 'S002' Then LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST(ShEndTime AS DATETIME),CAST([TimeOutSub] AS DATETIME)),0), 108),5) 

          WHEN CAST([TimeOutSub] AS DATETIME) >= ShEndTime And ShiftID = 'S001' Then LEFT(CONVERT(varchar(12), DATEADD(ms, DATEDIFF(ms, CAST(ShEndTime AS DATETIME), CAST([TimeOutSub] AS DATETIME)),0), 108),5) 

     ELSE '00:00' END, 108) 

ELSE 'ABSENT' END AS OverTime 

FROM times order by EmplID, ShiftID, DateVisited 
+0

你已经有一个'CASE'语句,这里有什么问题? –

+0

问题是假期我应该提及00:00在时间段 – PreciseTech

+0

对不起,也许我只是需要更多的咖啡。我们怎么知道这是假期? –

回答

1

如果您的问题仅仅依赖于知道什么时候一个日期是工作日/度假/周末我会建议使用一个数据仓库解决方案。创建一个包含所有假期/周末的表格并检查它。

根据日历以及您正在使用的其他日期,您可以使用许多脚本来为您创建脚本,但最简单的方法应该是在未来10年左右计算您的所有假日登陆时的情况。例如圣诞节总是在12月23日感恩节固定为3周月我将创建一个表像这样

CREATE TABLE Holiday 
(
HolidayID INT NOT NULL, --surrogate key, but you can just as easily make HolidayDate the Natural key 
HolidayDate DATE NOT NULL 
HolidayName NVARCHAR(30),--encase you need non English holiday names saved 
... 
... 
.. 


INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2014-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2015-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2016-12-23, 'Christmas') 
INSERT INTO Holiday (HolidayDate,HolidayName) VALUES (2017-12-23, 'Christmas') 
..... 
..... 
.... 

或者,如果你想获得更深入的你可以映射出以往天未来10年在表格中(日期维度表格)。然后将那些日子标记为节假日,取消工作,销售季度,以及没有。 (谷歌日期维度表)

+0

先生,我怎么不明白这个 – PreciseTech

+0

什么让你感到困惑,什么时候可以一步一步地过去,如果你想 – gh9