3

在生產中,我們有3班。在表中描述各移位定時tbl_ShiftSched:enter image description here獲取工作時間的基礎上排班分鐘

WT - 工作時間,PT - 突破時間。 ShiftTmID - 時間表2和3班。 我正在尋找簡單的方法來獲得開始和結束時間在幾分鐘內的工作時間。 例如,具有之間#2015年5月29日06輸入:10:00#和#2015年5月29日09:30:00#和tbl_WorkStations.WksID = 'GRD'(與ShiftTmID = '3P' 關係工作站代碼)應該給輸出190分鐘。

我在MS Access功能,這給了我所需要的輸出。但是,當遷移到T-SQL時,它變得非常複雜,因爲我沒有找到如何在T-SQL中使用別名的簡單方法。這裏是代碼:

USE [STRDAT] 
    GO 

    declare 
    @strWks varchar(3), 
    @dteIN datetime='2013.08.05 03:30', 
    @dteOUT datetime='2013.08.05 05:30', 
    @strShf varchar(12)=null,--'2013.08.04-3', 
    @strInd varchar(2) = 'WT', 
    @dteFTm datetime, 
    @dteShf date 
    [email protected] datetime, 
    [email protected] datetime 


    select top 1 
    @dteFTm = 
    case 
     when @strShf is not null 
     then (select shiftstart from tbl_ShiftSched where ShiftTmID=(select ShiftTiming from tbl_WorkStations where [email protected]) and shift=right(@strshf,1) and sortind=1) 
     else @dteIN-dateadd(day,datediff(day,0,@dteIN),0) --CAST(@dteIN-cast(floor(@dteIN) as float) as datetime) 
    end, 
    @dteShf= 
    case 
     when @strShf is not null 
     then left(@strShf,10) 
     else convert(varchar,dateadd(day,datediff(day,0,@dteIN),0),102) 
    end 

    --select @dteftm,@dteShf 

    SELECT tbl_ShiftSched.Shift, 
    tbl_ShiftSched.SortInd, 

    [ShiftStart]+ 
    case 
     when @dteFTm>[shiftstart] 
     then DateAdd(day,1,@dteShf) 
     else @dteShf 
     end AS PrdS, 
    [ShiftEnd]+ 
    case 
     when @dteFTm>[shiftend] 
     then DateAdd(day,1,@dteShf) 
     else @dteShf 
    end AS PrdE, 
    case 
     when @dteIN>=[PrdS] AND [PrdE]>[email protected] 
     then DateDiff(minute,@dteIN,@dteOUT) 
     else case 
      when @dteIN<=[PrdS] AND [PrdE]<[email protected] 
      then DateDiff(minute,[PrdS],[PrdE]) 
      else case 
       when [PrdS]<[email protected] AND @dteIN<=[PrdE] 
       then DateDiff(minute,@dteIN,[Prde]) 
       else case 
        when [PrdS]<[email protected] AND @dteOUT<=[PrdE] 
        then DateDiff(minute,[Prds],@dteOUT) 
        else 0 
        end 
       end 
      end 
     end AS Tm, 
    @dteIN AS S, 
    @dteOUT AS E, 
    tbl_ShiftSched.ShiftType,tbl_ShiftSched.ShiftStart,tbl_ShiftSched.ShiftEnd 
    FROM tbl_WorkStations 
    INNER JOIN tbl_ShiftSched ON tbl_WorkStations.ShiftTiming = tbl_ShiftSched.ShiftTmID 
    WHERE (((tbl_WorkStations.WksID)[email protected])) 

當然,它給了我一個錯誤無效的列名'PrdS'和'PrdE',因爲我使用別名。

必須有一些更簡單的方法來實現它。也許我是在錯誤的方向?...

回答

1

每當我不得不計算領域,並在第二場用的結果,我使用的是公用表表達式使第一次計算。鑑於此查詢,它可能是這樣的:

with cte_preprocess as 
(
    SELECT tbl_ShiftSched.Shift, 
    tbl_ShiftSched.SortInd, 

    [ShiftStart]+ 
    case 
     when @dteFTm>[shiftstart] 
     then DateAdd(day,1,@dteShf) 
     else @dteShf 
     end AS PrdS, 
    [ShiftEnd]+ 
    case 
     when @dteFTm>[shiftend] 
     then DateAdd(day,1,@dteShf) 
     else @dteShf 
    end AS PrdE, 
    tbl_ShiftSched.ShiftType,tbl_ShiftSched.ShiftStart,tbl_ShiftSched.ShiftEnd 
    FROM tbl_WorkStations 
    INNER JOIN tbl_ShiftSched ON tbl_WorkStations.ShiftTiming = tbl_ShiftSched.ShiftTmID 
    WHERE (((tbl_WorkStations.WksID)[email protected])) 
) 
SELECT [Shift] 
, SortInd 
, PrdS 
, PrdE 
, case 
     when @dteIN>=[PrdS] AND [PrdE]>[email protected] 
     then DateDiff(minute,@dteIN,@dteOUT) 
     else case 
      when @dteIN<=[PrdS] AND [PrdE]<[email protected] 
      then DateDiff(minute,[PrdS],[PrdE]) 
      else case 
       when [PrdS]<[email protected] AND @dteIN<=[PrdE] 
       then DateDiff(minute,@dteIN,[Prde]) 
       else case 
        when [PrdS]<[email protected] AND @dteOUT<=[PrdE] 
        then DateDiff(minute,[Prds],@dteOUT) 
        else 0 
        end 
       end 
      end 
     end AS Tm 
, @dteIN 
, @dteOUT 
, ShiftEnd 
FROM cte_preprocess 

更多關於CTE的here

+1

謝謝你,它仍然會產生對泄壓裝置同樣的錯誤,PrdE領域,所以我剛剛刪除的Tm場從代碼的第一部分和現在錯誤消失。儘管如此,它還是給我錯誤的結果,但它可能是不同的故事。 – litpost

+0

你說得對,我應該從第一部分中刪除TM。以爲我有...... – steenbergh