Добавление повторяющихся выходных для сотрудников в sql server

В настоящее время у меня есть эта таблица на сервере SQL:

PL_ID User_ID Log_Date Out_Time In_Time Причина Сведения

PL означает регистратор людей... тогда у вас есть идентификатор пользователя, дата регистрации (дата выходного дня), время выхода, время, причина и детали... есть фронт ASP, который позволяет пользователю добавлять свой день в таблицу, которая была написана кем-то другим... в настоящее время пользователи могут сделать это сами, это не проблема, однако мне дали задание добавить выходные для сотрудников на следующий ГОД.... они повторяются выходные дни (13:00 каждый понедельник) или (2-5 каждый четверг)... должен быть более простой способ сделать это, чем просто добавлять один выходной за один раз. Я попытался поэкспериментировать с dateadd, но я не могу понять синтаксис для включения его во вставку... однажды я планирую добавить это на страницу пользователя, но сейчас мне просто нужно получить их выходные в таблицу! извините за немного смелость, но я очень новичок в этом, и если я не найду простой способ вставить выходные, мне придется вручную делать это каждую неделю в течение следующего года!

заранее спасибо, ребята,

Том.

1 ответ

Решение

Если у вас есть таблица основных дат, вы можете просто запросить таблицу по понедельникам и вторникам на следующий год и использовать синтаксис Insert Select ....

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

Вы можете сделать это более эффективным, прыгая в другие дни вместо того, чтобы просто добавить один день...

КТР

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) 
Другие вопросы по тегам