none
TSQL Sorgu Hakkkında Çalışma Zamanı RRS feed

  • Soru

  • Merhaba arkadaşlar bir sorgu da 3 tane tablom var. Bir kullanıcı tablosu, çalışma saatlerini girdikleri tablo, tatil tablosu. Bu sorguda o hafta çalışma tablosuna giriş yapmış kullanıcıların hesaplaması yapılıyor.

    Burada ilk önce kullanıcı tablosunda kullanıcılar gelmeli ondan sonra o hafta çalışma zamanı girmiş ise hesaplama zamanı gelecek. Eğer hiç girmemiş ise 0 gelecek. 

    Hesaplama kısmını hallettim. Sadece yukarıdaki kısım kaldı. Burada nasıl bir yol izlemeliyim.

    declare @currentDate datetime = '2019-07-15'
    
    declare @basla datetime;
    declare @bitis datetime;
    declare @toplamSaat int;
    
    set @basla = (SELECT dateadd(hour, 12, DATEADD(wk, 0, DATEADD(DAY, 1-DATEPART(WEEKDAY, @currentDate), DATEDIFF(dd, 0,@currentDate)))))-6
    set @bitis = (SELECT dateadd(hour, 12, DATEADD(DAY,0,(DATEADD(wk, 1, DATEADD(DAY, 0-DATEPART(WEEKDAY, @currentDate), DATEDIFF(dd, 0, @currentDate)))))))-7
    set @toplamSaat = 0;
    
    declare @currentDay datetime;
    declare @i int = 0
    declare @halfDayUsedBefore bit = 0
    WHILE @i < 5
    BEGIN
    	set @currentDay = DATEADD(DAY, @i, @basla)
    	
    	declare @holidayId bigint = 0
    	declare @isHalfDay bit = 0
    	select top 1 @holidayId = ID from E_P_Parameters_F_HolidaysModal where @currentDay between txtStartDate and txtFinishDate
    	if (@holidayId > 0)
    	begin
    		if (@halfDayUsedBefore = 0)
    		begin
    			select @isHalfDay = chcYarim from E_P_Parameters_F_HolidaysModal where ID = @holidayId and CONVERT(date, @currentDay) = CONVERT(date, txtStartDate)
    
    			if (@isHalfDay = 1)
    			begin
    				set @toplamSaat = @toplamSaat + 4
    				set @halfDayUsedBefore = 1
    			end
    		end		
    	end
    	else
    	begin 
    		set @toplamSaat = @toplamSaat + 8
    	end
    
    	set @i = @i + 1
    
    END;
    
    SELECT                               
    
    PO.cbEmployee_TEXT [Kaynak],
    
    Sum(FM.txtHours) [Saat],
    
    
    datepart(wk,FM.txtEffortDate) Hafta, 
    
    datepart(wk, @basla) [HaftaBasi],
    
    datepart(wk, @bitis) [HaftaSonu], 
    
    case when Sum(FM.txtHours) < @toplamSaat then 1 else 0 end as [EksikVarmi],
    
    @toplamSaat as [Toplam Saat]
    
    FROM 
    
    E_DT_EforGiris_F_PortfoyCalisan PO
    
    LEFT  JOIN					E_DT_EforGiris_F_EforGiris F ON (F.txtEffortOwner_TEXT = PO.cbEmployee_TEXT)
    
    LEFT JOIN                   E_DT_EforGiris_F_EforGiris_dtyEffort D ON (F.ID=D.FORMID)
    
    LEFT JOIN                   E_DT_EforGiris_F_EforModal FM ON (D.DOCUMENTID=FM.ID)
    
    LEFT JOIN					 E_DT_EforGiris_F_PortfoyCalisan PO ON (FM.txtEffortOwner_TEXT = PO.cbEmployee_TEXT)
    
    LEFT JOIN					OSUSERS O ON (PO.cbEmployee = O.ID) 
    
    LEFT JOIN                   OSMANAGERS OS ON (OS.USERID = O.ID)
    
    LEFT JOIN                   OSUSERS OS2 ON (OS.MANAGERUSERID = OS2.ID)
    
    LEFT JOIN                   DOCUMENTS DO ON (DO.ID=F.ID AND DO.DELETED=0)
    
    LEFT JOIN                   LIVEFLOWS LF ON (DO.OWNERPROCESSID=LF.ID AND LF.DELETED=0 AND LF.STATUS=20)
    
    LEFT JOIN                  DOCUMENTS DC ON (DC.ID=FM.ID AND DC.DELETED=0)
    
    
    Where year(FM.txtEffortDate) = YEAR(@basla) and DATEPART(wk,FM.txtEffortDate) = DATEPART(wk,@basla)
    
    Group by
    
    PO.cbEmployee_TEXT,
    datepart(wk,FM.txtEffortDate)

    13 Temmuz 2019 Cumartesi 12:56