2

以下のようにストアドプロシージャを作成しました。

ALTER PROCEDURE reminders
AS

BEGIN
SET NOCOUNT ON;

DECLARE @MyDate    DATE, 
@FirstDate DATE, 
@LastDate  DATE 

SELECT @MyDate = Getdate()


 SELECT @FirstDate = CONVERT(VARCHAR(25), Dateadd(dd, -( Day(@mydate) - 1 ), @mydate), 100),  @LastDate = CONVERT(VARCHAR(25), Dateadd(dd, -( Day( Dateadd(mm, 1, @mydate)) ), 
 Dateadd(mm, 1, @mydate)), 100) 


DECLARE @AllDates TABLE 
( 
datevalue DATE
) 
DECLARE @Lastday INT 

SET @Lastday = Datepart(d, @LastDate) 

DECLARE @Days INT 

SET @Days = 1 


WHILE @Days <= @Lastday 
BEGIN 
INSERT INTO @AllDates 
SELECT @FirstDate 

SET @FirstDate = Dateadd(d, 1, @FirstDate) 
SET @Days = @Days + 1 
END 


SELECT AD.datevalue 
FROM   @AllDates AD 
LEFT OUTER JOIN EmpLog EL 
ON AD.datevalue = EL.Date
LEFT OUTER JOIN holiday H 
ON AD.datevalue = H.Date

WHERE  EL.Date IS NULL 
AND H.Date IS NULL  
AND DATENAME(dw,AD.DateValue) NOT IN ('Saturday','Sunday')

END

私が持っている必要があるのは、出力に将来の日が含まれていてはならないということです。今日12-21-2012のExDateは、そのコードの出力には2012年12月22日から2012年12月31日までが含まれます。また、現在の日付の16日前にのみコードを出力する必要があります。元。今日の日付は12-21-2012、そのコードの出力が11月30日から12月21日で、休日と週末を除いたものになるためです。

ありがとうございました

4

2 に答える 2

0

Justine - この手順を使用します。入力パラメーターとして開始日と終了日を受け入れます。これらの2つの日付の間に望ましい結果が得られます.

ALTER PROCEDURE reminders

@FirstDate DATE, 
@LastDate  DATE 

AS
BEGIN
SET NOCOUNT ON;

DECLARE @AllDates TABLE 
( 
datevalue DATE
) 

WHILE @FirstDate <= @Lastdate 
BEGIN 
INSERT INTO @AllDates 
SELECT @FirstDate 
SET @FirstDate = Dateadd(d, 1, @FirstDate) 
END 


SELECT AD.datevalue 
FROM   @AllDates AD 
LEFT OUTER JOIN EmpLog EL 
ON AD.datevalue = EL.Date
LEFT OUTER JOIN holiday H 
ON AD.datevalue = H.Date

WHERE  EL.Date IS NULL 
AND H.Date IS NULL  
AND DATENAME(dw,AD.DateValue) NOT IN ('Saturday','Sunday')

END

ラージ

于 2012-12-21T06:30:03.693 に答える
0

SQLServer2005+ では、再帰 CTE を使用します

ALTER PROCEDURE reminders
AS
BEGIN
  SET NOCOUNT ON;
  DECLARE @MyDate date = GETDATE()
  ;WITH cte AS
   (
    SELECT @MyDate AS datevalue,
           1 AS [count_all_days],
           CASE WHEN DATENAME(dw, DATEADD(dd, - 1, @MyDate)) IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END AS [count_week_days]
    UNION ALL
    SELECT DATEADD(dd, - [count_all_days], @MyDate), 
           [count_all_days] + 1,
           CASE WHEN DATENAME(dw, DATEADD(dd, - [count_all_days], @MyDate)) IN ('Saturday', 'Sunday') THEN [count_week_days] + 1 ELSE [count_week_days] END
    FROM cte
    WHERE [count_all_days] - [count_week_days] < 16
    )
    SELECT AD.datevalue
    FROM cte AD LEFT JOIN EmpLog EL ON AD.datevalue = EL.Date
                LEFT JOIN holiday H ON AD.datevalue = H.Date
    WHERE EL.Date IS NULL AND H.Date IS NULL  AND DATENAME(dw, AD.DateValue) NOT IN ('Saturday', 'Sunday')
END
于 2012-12-21T09:49:33.127 に答える