2016-05-04 6 views
-1

私は、利用可能なスケジュールを持つテーブルがあります。は、SQL Serverで次の二つの可能なスケジュールをゲット

enter image description here

(WeekOfTheDay 1 - 日曜日、2 - 月曜日...)

私の目標は得ることですが次の2日間、利用可能なスケジュールで、日付まで。私は一日2016年4月5日午前9時00分があれば、私は、例えば

を取得する必要があります

日2016年4月5日

enter image description here

日05- 05から2016

enter image description here

私は一日2016年5月5日午後07時持っている場合は、私が取得する必要があります。

日2016年9月5日

enter image description here

日2016年10月5日

enter image description here

これを解決するために、私は次の週を希望の日付までにしようとします:

with cteAS 
(
    SELECT 0 as [Num] 
    UNION ALL 
    SELECT [Num] + 1 
    FROM cte 
    WHERE [Num] + 1 <= 6 
) 
INSERT INTO @auxDays ([Day], WeekDayValue) 
    SELECT 
     dateadd(dd, [Num], @actualDate), 
     DATEPART(dw, dateadd(dd, [Num], @actualDate)) 
    FROM cte; 

SELECT D.[Day] 
FROM ScheduleTbl T 
INNER JOIN @auxDays D ON D.WeekDayValue = T.WeelkOfTheDay 
WHERE T.BeginHour >= @hourFromActualDate 
ORDER BY D.[Day] ASC 

@hourFromActualDate - >私の@actualDateは'04 -05-2016 9:00' 、そうであるならば - 私はhourFromActualDateでフィルタリングするとき別> 9時

を私は本当の次の二つを取得することはできません利用可能なスケジュール。

+0

あなたは2016年5月5日夜07時を渡し、その後、なぜあなたは2016年9月5日、および2016年10月5日を取得する必要があります。 – KumarHarsh

+1

サンプルデータはDDLとDMLを提供し、他の人があなたを助けるのを助けてください。 – Serg

答えて

0

利用可能なスケジュールで次の2つの日付を計算するためにCTEを使用できます。より便利にするには、検索を開始する日付と時刻のパラメーターを使用してストアード・プロシージャーにすることができます。

この例では、最初にテーブルを作成し、それを設定します。 (注:実際のシステムでは、より厳密な制約が必要です。)

CREATE TABLE dbo.AvailableSchedule 
(
    BeginDateTime datetime2(0) NOT NULL PRIMARY KEY, 
    EndDateTime datetime2(0) NOT NULL, 
    DayOfWk AS DATEPART(weekday, BeginDateTime), 
    CONSTRAINT CK_BeginEndRange CHECK (EndDateTime > BeginDateTime) 
); 
GO 

INSERT INTO dbo.AvailableSchedule (BeginDateTime, EndDateTime) 
    VALUES ('2016-05-02 00:00', '2016-05-02 03:00'), 
     ('2016-05-04 12:00', '2016-05-04 17:00'), 
     ('2016-05-04 17:30', '2016-05-04 19:00'), 
     ('2016-05-05 13:00', '2016-05-05 14:00'), 
     ('2016-05-09 00:00', '2016-05-09 03:00'), 
     ('2016-05-10 12:00', '2016-05-10 17:00'), 
     ('2016-05-10 17:30', '2016-05-10 19:00'); 
GO 

結果を計算するストアドプロシージャを作成します。

CREATE PROCEDURE up_NextTwoDaysSchedules 
(
    @Date datetime2(0) 
) 
AS 
WITH cte AS 
(
    -- Get the next two dates with available schedules 
    SELECT TOP(2) CAST(BeginDateTime AS date) AS 'Date' 
     FROM dbo.AvailableSchedule 
     WHERE BeginDateTime >= @Date 
     GROUP BY CAST(BeginDateTime AS date) 
     ORDER BY [Date] 
) 
SELECT * 
    FROM dbo.AvailableSchedule AS A 
     INNER JOIN cte AS C 
      ON A.BeginDateTime >= C.[Date] AND A.BeginDateTime < DATEADD(day, 1, C.[Date]) 
    WHERE A.BeginDateTime >= @Date 
    ORDER BY A.BeginDateTime; 

ストアドプロシージャをテストします。

EXEC up_NextTwoDaysSchedules @Date='2016-05-04 09:00'; 

EXEC up_NextTwoDaysSchedules @Date='2016-05-05 19:00'; 

enter image description here

関連する問題