none
일정 응용 프로그램에서 새 약속에 대 한 첫 번째 사용 가능한 일정 시간 (시간 슬롯)을 찾는 경우가 있습니다. SQL 서버에서 일정에 대한 첫 번째 사용 가능한 시간 슬롯을 찾을 방법 문의 드립니다. RRS feed

  • 질문

  • 일정 응용 프로그램에서 새 약속에 대 한 첫 번째 사용 가능한 일정 시간 (시간 슬롯)을 찾는 경우가 있습니다.
    SQL 서버에서 일정에 대한 첫 번째 사용 가능한 시간 슬롯을 찾을 방법 문의 드립니다.

    2014년 4월 30일 수요일 오전 2:18

답변

  • 아래 참조하시기 바랍니다.

    Create Sample Data
    -- Suppress data loading messages
    SET NOCOUNT ON
     
    DECLARE @Schedule table
       (  AppID      int   IDENTITY, 
          AppTeam    varchar(20),
          AppStart   datetime,
          AppFinish  datetime
       )
     
    INSERT INTO @Schedule VALUES ( 'Start', NULL, '01/11/2007 09:00' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 09:00', '01/11/2007 09:30' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 10:00', '01/11/2007 10:15' )
    INSERT INTO @Schedule VALUES ( 'Jones', '01/11/2007 11:00', '01/11/2007 12:00' )
    INSERT INTO @Schedule VALUES ( 'Williams', '01/11/2007 12:00', '01/11/2007 14:45' )
    INSERT INTO @Schedule VALUES ( 'Hsiao', '01/11/2007 15:30', '01/11/2007 16:00' )
    INSERT INTO @Schedule VALUES ( 'Lopez', '01/11/2007 16:00', '01/11/2007 17:30' )
    INSERT INTO @Schedule VALUES ( 'Green', '01/11/2007 17:30', '01/11/2007 18:30' )
    INSERT INTO @Schedule VALUES ( 'Alphonso', '01/11/2007 20:00', '01/11/2007 20:30' )
    INSERT INTO @Schedule VALUES ( 'End', '01/11/2007 21:00', NULL )
    

    Return to Top

    SQL Server 2005 / SQL Server 2008 Solution
    -- Determine the Length of Time Required
     
    DECLARE @AppNeed int
    SET @AppNeed = 45
     
    --Find FIRST Available Time Slot
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT FirstApptAvail = min( a.AppFinish )
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

     

    FirstApptAvail
    2007-01-11 10:15:00.000

    Return to Top

    --Find All Available Time Slots
     
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT TOP 3 ApptOptions = a.AppFinish
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

    AppOptions

    2007-01-11 10:15:00.000

    2007-01-11 14:45:00.000
    2007-01-11 18:30:00.000

    제시해 드린 답변이 도움이 되었기를 바랍니다.
     
    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.

    아래 참조하시기 바랍니다.

    Create Sample Data
    -- Suppress data loading messages
    SET NOCOUNT ON
     
    DECLARE @Schedule table
       (  AppID      int   IDENTITY, 
          AppTeam    varchar(20),
          AppStart   datetime,
          AppFinish  datetime
       )
     
    INSERT INTO @Schedule VALUES ( 'Start', NULL, '01/11/2007 09:00' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 09:00', '01/11/2007 09:30' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 10:00', '01/11/2007 10:15' )
    INSERT INTO @Schedule VALUES ( 'Jones', '01/11/2007 11:00', '01/11/2007 12:00' )
    INSERT INTO @Schedule VALUES ( 'Williams', '01/11/2007 12:00', '01/11/2007 14:45' )
    INSERT INTO @Schedule VALUES ( 'Hsiao', '01/11/2007 15:30', '01/11/2007 16:00' )
    INSERT INTO @Schedule VALUES ( 'Lopez', '01/11/2007 16:00', '01/11/2007 17:30' )
    INSERT INTO @Schedule VALUES ( 'Green', '01/11/2007 17:30', '01/11/2007 18:30' )
    INSERT INTO @Schedule VALUES ( 'Alphonso', '01/11/2007 20:00', '01/11/2007 20:30' )
    INSERT INTO @Schedule VALUES ( 'End', '01/11/2007 21:00', NULL )
    

    Return to Top

    SQL Server 2005 / SQL Server 2008 Solution
    -- Determine the Length of Time Required
     
    DECLARE @AppNeed int
    SET @AppNeed = 45
     
    --Find FIRST Available Time Slot
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT FirstApptAvail = min( a.AppFinish )
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

     

    FirstApptAvail
    2007-01-11 10:15:00.000

    Return to Top

    --Find All Available Time Slots
     
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT TOP 3 ApptOptions = a.AppFinish
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

    AppOptions

    2007-01-11 10:15:00.000

    2007-01-11 14:45:00.000
    2007-01-11 18:30:00.000

    제시해 드린 답변이 도움이 되었기를 바랍니다.
     
    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.

    아래 참조하시기 바랍니다.

    Create Sample Data
    -- Suppress data loading messages
    SET NOCOUNT ON
     
    DECLARE @Schedule table
       (  AppID      int   IDENTITY, 
          AppTeam    varchar(20),
          AppStart   datetime,
          AppFinish  datetime
       )
     
    INSERT INTO @Schedule VALUES ( 'Start', NULL, '01/11/2007 09:00' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 09:00', '01/11/2007 09:30' )
    INSERT INTO @Schedule VALUES ( 'Smith', '01/11/2007 10:00', '01/11/2007 10:15' )
    INSERT INTO @Schedule VALUES ( 'Jones', '01/11/2007 11:00', '01/11/2007 12:00' )
    INSERT INTO @Schedule VALUES ( 'Williams', '01/11/2007 12:00', '01/11/2007 14:45' )
    INSERT INTO @Schedule VALUES ( 'Hsiao', '01/11/2007 15:30', '01/11/2007 16:00' )
    INSERT INTO @Schedule VALUES ( 'Lopez', '01/11/2007 16:00', '01/11/2007 17:30' )
    INSERT INTO @Schedule VALUES ( 'Green', '01/11/2007 17:30', '01/11/2007 18:30' )
    INSERT INTO @Schedule VALUES ( 'Alphonso', '01/11/2007 20:00', '01/11/2007 20:30' )
    INSERT INTO @Schedule VALUES ( 'End', '01/11/2007 21:00', NULL )
    

    Return to Top

    SQL Server 2005 / SQL Server 2008 Solution
    -- Determine the Length of Time Required
     
    DECLARE @AppNeed int
    SET @AppNeed = 45
     
    --Find FIRST Available Time Slot
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT FirstApptAvail = min( a.AppFinish )
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

     

    FirstApptAvail
    2007-01-11 10:15:00.000

    Return to Top

    --Find All Available Time Slots
     
    ;WITH CTE
    AS (  SELECT 
             *, 
             RowNumber = ROW_NUMBER() OVER( ORDER BY AppStart ASC )
          FROM @MySchedule 
       )
       SELECT TOP 3 ApptOptions = a.AppFinish
       FROM CTE a
          INNER JOIN CTE b
             ON a.RowNumber = b.RowNumber - 1
       WHERE datediff( minute, a.AppFinish, b.AppStart) >= @AppNeed
    

    AppOptions

    2007-01-11 10:15:00.000

    2007-01-11 14:45:00.000
    2007-01-11 18:30:00.000

    제시해 드린 답변이 도움이 되었기를 바랍니다.
     
    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.

    • 답변으로 표시됨 Ian Kim 2014년 5월 7일 수요일 오전 6:06
    2014년 4월 30일 수요일 오전 3:46
    중재자