2016-11-21 135 views
0

我最近似乎在這裏問了很多問題,在此先感謝您的幫助!假期預訂系統,搜索日期 - 返回當天假期的員工名單

首先 - 我有一個日曆表,這可能會使這更容易。日曆表格非常標準,日期ID,日期以及該日期的不同格式。

我想給查詢一個日期,併爲它返回一個所有員工的列表,以及他們是否在那天假期。

Employee Table Leave Table

LeaveTypeID是1假日2病假,3體恤,等等,等等,我只關心在這一點上的節日。 開始日期和結束日期是他們出現的日期 開始日期是假期是否在第一天的午間開始(所以早上開始工作並在午餐時間開始假期),在末日但節假日結束時相同)

理想情況下,如果可能,最好還是說這天是否是半天? 所以我想我的結果是這樣的(假設我選擇了11月4日的日期,2016)

EmployeeID OnHoliday IsHalf 
1    TRUE  TRUE 
2    FALSE  FALSE 
3    FALSE  FALSE 
4    FALSE  FALSE 
5    FALSE  FALSE 

希望這是足夠的信息。提前再次感謝!

+0

「[IsHalf]」的邏輯是什麼? –

+2

向我們顯示您當前的查詢嘗試。 – jarlh

+0

@TedoG。對不起,它沒有與表格的屏幕截圖對齊。 假期持續3天,其中第一天是半天 - 第一天將顯示真實,其他2天將顯示真實,假的 – hero9989

回答

0

我認爲你可以爲這個目的之間使用:

declare @InputDate date='2016-09-16' --yur input date 

    select EmployeeId, 
    case when (select count(1) from EmployeeLeave 
    where (@InputDate between StartDate and EndDate) 
    and EmployeeLeave .EmployeeId=Employee .EmployeeId)>1 then 'True' else 'False' end as [OnHoliday], 
    case when ((select StartMidDay from EmployeeLeave 
    where (@InputDate between StartDate and EndDate) 
    and EmployeeLeave .EmployeeId=Employee .EmployeeId))=0.5 then 'True' else 'False' end as [IsHalf] , 
    from Employee 
+0

我無法正常工作 Msg 156,Level 15,State 1,Line 5 關鍵字'if'附近的語法不正確。 Msg 156,Level 15,State 1,Line 7 關鍵字'then'附近的語法不正確。 Msg 102,Level 15,State 1,Line 10 '='附近的語法不正確。 – hero9989

+0

再次檢查 –

+0

在最後一行的From員工之前有一個額外的逗號,但在服用後它像夢一樣工作。 完美解答我的原始問題! – hero9989

0

我想我可能已經想出了一個解決方案通過自己

declare @DateAdd int=0 --add Days From Monday 
declare @LeaveType int=1 -- Leave Type 

declare @SelctedDate date = DATEADD(DD, @DateAdd, CAST('2016-11-21' AS DATE)) --Week Commencing 

select 
     (CASE 
      WHEN (leaveTemp.StartMidday = '0.5' AND leaveTemp.StartDate = @SelctedDate) THEN '4:00' 
      WHEN (leaveTemp.EndMidday = '0.5' AND leaveTemp.EndDate = @SelctedDate) THEN '4:00' 
      WHEN LeaveID is not null THEN '8:00' 
      ELSE NULL 
     END) as HolMon 

from Employee left join 
(select employeeID, LeaveID, StartDate, EndDate, StartMidday, EndMidday 
     from EmployeeLeave 
     where [email protected] and @SelctedDate between startdate and enddate 
) as leaveTemp 
on Employee.EmployeeID = leaveTemp.EmployeeID 
ORDER BY Employee.EmployeeForename, Employee.EmployeeID 

這似乎帶回什麼我之後,但是做到這一點的最佳方式?

+0

是否可以將此查詢中的其他字段組合到單個列中? 而不是 select employeeID,LeaveID,enddate,StartMidday,EndMidday 可能是 select employeeID,[如果startmidday或endmidday = 0。5然後一半,如果leaveID不爲空然後完整其他空] – hero9989

+0

這將工作,雖然它會給你多行,如果一個員工碰巧有多個假記錄在同一時間。如果您能夠爲每天有人休假,然後您只是在一個日期列上查詢,爲這些類型的問題變得更容易。 – mheptinstall