在sql server中添加定期员工假期

时间:2012-09-21 14:33:25

标签: sql sql-server-2008-r2 datediff dateadd recurring-events

我目前在SQL server中有这个表:

PL_ID User_ID Log_Date Out_Time In_Time原因详细信息

PL代表人物记录器...然后你有用户ID,日志日期(休息日),出时间,时间,原因和细节......有一个ASP前端允许用户将他们的一天添加到由其他人写的表中......目前用户能够自己做这件事不是一个问题,但我已经被赋予了为下一年增加员工休假的任务....他们是经常休息的日子(每个星期一下午1-3点)或(每周四2-5)...必须有一个更简单的方法来做到这一点,而不是一次只加一天。我已经尝试过尝试使用dateadd但是我无法弄清楚将其包含在插入中的语法...有一天我打算将其添加到用户页面但是现在我只需要将它们的日子放到桌面上!对不起有点vauge,但我对此非常新,如果我没有想出一个简单的方法来插入休息日,我将不得不每年手动完成它为明年!

先谢谢你们,

汤姆。

1 个答案:

答案 0 :(得分:0)

如果你有一个主日期表,你可以简单地查询表明天的星期一和Thrusdays,并可以使用Insert Select ... Syntax。

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)