2012-09-21 20 views
-1

目前,我有這個表中的SQL服務器:增加經常性的員工假期

PL_ID USER_ID LOG_DATE Out_time的原因的In_Time詳細

PL代表了人們記錄......那麼你有用戶ID,日誌日期(休息日),外出時間,時間,原因和詳細信息......有一個ASP前臺,它允許用戶將他們的休息日添加到其他人已經寫好的表中......目前用戶能夠自己做到這一點並不是問題,但我已被賦予爲下一個年頭增加員工休息日的任務......他們經常休息(每週一至週五下午1-3點)或(每週四)...必須有一個更簡單的方法來做到這一點而不僅僅是一次添加一天。我曾嘗試過用dateadd做實驗,但是我無法弄清楚它的插入語法...有一天,我打算把這個添加到用戶頁面,但現在我只需要把他們的日子放到桌子上!對不起,我感到很抱歉,但我對此很新,如果我沒有想到一個簡單的方法來插入休息日,我將不得不每個星期手動做下一年!

在此先感謝你們,

湯姆。

回答

0

如果你有一個主日期表,你可以簡單地查詢下一年的星期一和星期四的表格,並且可以使用插入選擇...語法。

DECLARE @StartDate DateTime 
DECLARE @EndDate DateTime 
SET @StartDate = '1/1/2013' 
SET @EndDate = '12/31/2013' 

INSERT INTO DestinationTable(Date,StartTime,EndTime) 
SELECT DM.Date, 
     CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400' 
      WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300' 
     END AS StartTime, 
     CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700' 
      WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500' 
     END AS EndTime  
    FROM DateMaster DM 
WHERE DM.Date Between @StartDate AND @EndDate 
    AND DATENAME(dw,DM.Date) IN ('Thursday','Monday') 

但是,如果您沒有主日期表,那麼我們可以循環整整一年並填寫表格。

DECLARE @StartDate DateTime 
DECLARE @EndDate DateTime 
DECLARE @DateVar DateTime 

SET @StartDate = '1/1/2013' 
SET @EndDate = '12/31/2013' 
SET @DateVar = @StartDate 

WHILE @DateVar <= @EndDate 
BEGIN 
    INSERT INTO DestinationTable(Date,StartTime,EndTime) 
    SELECT @DateVar, 
      CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1400' 
       WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1300' 
      END AS StartTime, 
      CASE WHEN DATENAME(dw,@DateVar) = 'Thursday' THEN '1700' 
       WHEN DATENAME(dw,@DateVar) = 'Monday' THEN '1500' 
      END AS EndTime  
     WHERE DATENAME(dw,@DateVar) IN ('Thursday','Monday') 

    SET @DateVar = DATEADD(d,1,@DateVar) 
END 

您可以通過跳躍其他天,而不是僅僅增加一天可以更有效......

CTE

DECLARE @StartDate DateTime 
DECLARE @EndDate DateTime 
SET @StartDate = '1/1/2013' 
SET @EndDate = '12/31/2013' 

;WITH DateMaster(Date) 
AS 
(
    SELECT @StartDate 
    UNION ALL 
    SELECT DATEADD(d,1,Date) 
     FROM DateMaster 
    WHERE DATEADD(d,1,Date) <= @EndDate 
    ) 


INSERT INTO DestinationTable(Date,StartTime,EndTime) 
SELECT DM.Date, 
     CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1400' 
      WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1300' 
     END AS StartTime, 
     CASE WHEN DATENAME(dw,DM.Date) = 'Thursday' THEN '1700' 
      WHEN DATENAME(dw,DM.Date) = 'Monday' THEN '1500' 
     END AS EndTime  
    FROM DateMaster DM 
WHERE DM.Date >= @StartDate AND DM.Date <= @EndDate 
    AND DATENAME(dw,DM.Date) IN ('Thursday','Monday') 
OPTION (MAXRECURSION 366) 
+0

您_really_不應該使用'BETWEEN'來(在所有,真的)與日期/時間值,_especially_在SQL Server(由於一些日期/時間特性)。如果你沒有日期表,通常的結果是用遞歸CTE生成它(導致一個'虛擬'表),這可能比迭代循環好得多。 –

+0

謝謝,更新了答案.... –

+0

感謝您的快速回復傢伙!將測試這個星期一上午。我對case語句有一些以前的SQL經驗,但是數據庫結構與im當前的環境完全不同。 –