-1

私は現在SQLサーバーにこのテーブルを持っています:

PL_ID User_ID Log_DateOut_TimeIn_Time理由の詳細

PLはピープルロガーの略です...次に、ユーザーID、ログの日付(休日の日付)、時間、時間、理由、詳細があります...ユーザーが自分の日を追加できるASPフロントがあります他の誰かによって書かれたテーブルにオフに...現在、ユーザーが自分でこれを行うことができるかどうかは問題ではありませんが、私は次の年の従業員の休日を追加するタスクを与えられました....彼らは繰り返します休日(毎週月曜日の午後1時から午後3時)または(毎週木曜日の午後2時から5時)...一度に1日の休日を追加するよりも、これを行う簡単な方法が必要です。dateaddを試してみましたが、挿入に含める構文がわかりません...いつかこれをユーザーページに追加する予定ですが、今のところ、テーブルに休みをとる必要があります。

よろしくお願いします。

トム。

4

1 に答える 1

0

マスター日付テーブルがある場合は、来年の月曜日と木曜日のテーブルをクエリするだけで、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')

ただし、マスター日付テーブルがない場合は、1年全体をループして、テーブルに入力するだけです。

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

1日を追加するだけでなく、他の日をジャンプすることで、より効率的にすることができます...

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) 
于 2012-09-21T15:11:16.767 に答える