Sql server 我如何为店铺的时间表和店主的可用性创建时间段?

Sql server 我如何为店铺的时间表和店主的可用性创建时间段?,sql-server,database,sql-server-2008,join,relational-database,Sql Server,Database,Sql Server 2008,Join,Relational Database,如何为店铺的时间表创建时间段,并将其映射到店主时间表,并使用SQL Server创建店主可用的时间段列表 我有两张桌子;第一张是开店时间和关门时间,第二张是店主时间表 我想创建15分钟的时间段,并标记店主是否有空 如果店主刚好按计划工作,即从9:00到17:00一班工作,我可以做到这一点 问题是当店主两班倒工作时。i、 e.从上午9点到下午12点,然后是下午2点到4点 提前谢谢 车间时间表: 店主时间表: 附表: 以下是一种使用各种临时表生成计划的方法: -- =================

如何为店铺的时间表创建时间段,并将其映射到店主时间表,并使用SQL Server创建店主可用的时间段列表

我有两张桌子;第一张是开店时间和关门时间,第二张是店主时间表

我想创建15分钟的时间段,并标记店主是否有空

如果店主刚好按计划工作,即从9:00到17:00一班工作,我可以做到这一点

问题是当店主两班倒工作时。i、 e.从上午9点到下午12点,然后是下午2点到4点

提前谢谢

车间时间表:

店主时间表:

附表:


以下是一种使用各种临时表生成计划的方法:

-- ================================================
-- GIVEN DATA - Table of ShopKeeper Schedule 
CREATE TABLE #SKSchedule (
    ShopKeeperId int
    , ShopKeeperStart int
    , ShopKeeperEnd int
    , ShopID int
    );

INSERT INTO #SKSchedule VALUES
(1            , 900                  , 1800              ,  1        )
,(2            , 900                  , 1200              ,  1        )
,(2            , 1400                 , 1700              ,  1        )
,(3            , 830                  , 1600              ,  2        )
,(4            , 845                  , 1630              ,  2        )
,(5           , 845                  , 1630              ,  4       )
;

-- ================================================
-- GIVEN DATA - Table of Shop opening times
CREATE TABLE #ShopOpenClose(
    ID int
    , ShopOpen int
    , ShopClose int
    , ShopID int
    );
INSERT INTO #ShopOpenClose VALUES
(1  , 900        , 1800      ,  1            )
,(2  , 900        , 1730      ,  2            )
,(3  , 830        , 1600      ,  3            )
,(4  , 845        , 1630      ,  4            );



-- ================================================
-- Extract a list of shopkeeper/shop combos into ShopkeeperShop table
CREATE TABLE #SKSHOP(
    ShopKeeperID int
    , ShopID int
    )
INSERT INTO #SKSHOP SELECT DISTINCT ShopkeeperID, ShopID from #SKSchedule;


-- ================================================
-- Create a table of all possible time slots in a day
CREATE TABLE #TIMESLOTS (
     TSStart int
    , TSEnd int
    );

    -- Variables for the four quarter-hours in an hour, starting at 0900
    DECLARE @AA int = 900, @BB int = 915, @CC int = 930, @DD int = 945, @EE int = 1000;
    DECLARE @PP int = 0;

    -- Loop to create 10 hours 09-10 through 18-19
    WHILE @PP < 900
    BEGIN
        INSERT INTO #TIMESLOTS  

        VALUES 
            ( @AA + @PP, @BB + @PP ) , (@BB + @PP, @CC + @PP ), ( @CC + @PP, @DD + @PP ), (@DD + @PP, @EE + @PP );

        SET @PP = @PP + 100;
    END;


-- ================================================
-- Create a table of all possible timeslots per shopkeeper/shop, taking
-- into account the shop opening hours

SELECT SKS.ShopKeeperID
    , SKS.ShopID
    , TSL.TSStart ShopSlotStart
    , TSL.TSEnd ShopSlotEnd
    INTO #SKSHTS
    FROM #SKSHOP SKS
    CROSS JOIN #TIMESLOTS TSL;

    -- Remove those timeslots that are outside the shop opening hours range
    DELETE SKS FROM
        #SKSHTS SKS
        JOIN #ShopOpenClose SOC
         ON 
            SKS.ShopID = SOC.ShopID
         AND (SKS.ShopSlotStart < SOC.ShopOpen
         OR SKS.ShopSlotEnd > SOC.ShopClose);




-- ================================================
-- Now report all the shopslots indicating shopkeepers'
-- availability based on the shopkeepers' times
SELECT 
     TSLT.ShopKeeperID
    , TSLT.ShopID
    , TSLT.ShopslotStart
    , TSLT.ShopslotEnd
    , CASE WHEN SSCH.ShopKeeperID IS NULL THEN 0 ELSE 1 END ShopKeeperAvailable

    FROM 
        #SKSHTS TSLT
        LEFT JOIN #SKSchedule SSCH          
        ON TSLT.ShopID = SSCH.ShopID
            AND TSLT.ShopKeeperID = SSCH.ShopkeeperID
            AND TSLT.ShopslotStart >= SSCH.ShopKeeperStart 
            AND TSLT.ShopslotEnd <= SSCH.ShopKeeperEnd 

    ORDER BY ShopID, ShopSlotStart, ShopKeeperID;

以下是一种使用各种临时表生成计划的方法:

-- ================================================
-- GIVEN DATA - Table of ShopKeeper Schedule 
CREATE TABLE #SKSchedule (
    ShopKeeperId int
    , ShopKeeperStart int
    , ShopKeeperEnd int
    , ShopID int
    );

INSERT INTO #SKSchedule VALUES
(1            , 900                  , 1800              ,  1        )
,(2            , 900                  , 1200              ,  1        )
,(2            , 1400                 , 1700              ,  1        )
,(3            , 830                  , 1600              ,  2        )
,(4            , 845                  , 1630              ,  2        )
,(5           , 845                  , 1630              ,  4       )
;

-- ================================================
-- GIVEN DATA - Table of Shop opening times
CREATE TABLE #ShopOpenClose(
    ID int
    , ShopOpen int
    , ShopClose int
    , ShopID int
    );
INSERT INTO #ShopOpenClose VALUES
(1  , 900        , 1800      ,  1            )
,(2  , 900        , 1730      ,  2            )
,(3  , 830        , 1600      ,  3            )
,(4  , 845        , 1630      ,  4            );



-- ================================================
-- Extract a list of shopkeeper/shop combos into ShopkeeperShop table
CREATE TABLE #SKSHOP(
    ShopKeeperID int
    , ShopID int
    )
INSERT INTO #SKSHOP SELECT DISTINCT ShopkeeperID, ShopID from #SKSchedule;


-- ================================================
-- Create a table of all possible time slots in a day
CREATE TABLE #TIMESLOTS (
     TSStart int
    , TSEnd int
    );

    -- Variables for the four quarter-hours in an hour, starting at 0900
    DECLARE @AA int = 900, @BB int = 915, @CC int = 930, @DD int = 945, @EE int = 1000;
    DECLARE @PP int = 0;

    -- Loop to create 10 hours 09-10 through 18-19
    WHILE @PP < 900
    BEGIN
        INSERT INTO #TIMESLOTS  

        VALUES 
            ( @AA + @PP, @BB + @PP ) , (@BB + @PP, @CC + @PP ), ( @CC + @PP, @DD + @PP ), (@DD + @PP, @EE + @PP );

        SET @PP = @PP + 100;
    END;


-- ================================================
-- Create a table of all possible timeslots per shopkeeper/shop, taking
-- into account the shop opening hours

SELECT SKS.ShopKeeperID
    , SKS.ShopID
    , TSL.TSStart ShopSlotStart
    , TSL.TSEnd ShopSlotEnd
    INTO #SKSHTS
    FROM #SKSHOP SKS
    CROSS JOIN #TIMESLOTS TSL;

    -- Remove those timeslots that are outside the shop opening hours range
    DELETE SKS FROM
        #SKSHTS SKS
        JOIN #ShopOpenClose SOC
         ON 
            SKS.ShopID = SOC.ShopID
         AND (SKS.ShopSlotStart < SOC.ShopOpen
         OR SKS.ShopSlotEnd > SOC.ShopClose);




-- ================================================
-- Now report all the shopslots indicating shopkeepers'
-- availability based on the shopkeepers' times
SELECT 
     TSLT.ShopKeeperID
    , TSLT.ShopID
    , TSLT.ShopslotStart
    , TSLT.ShopslotEnd
    , CASE WHEN SSCH.ShopKeeperID IS NULL THEN 0 ELSE 1 END ShopKeeperAvailable

    FROM 
        #SKSHTS TSLT
        LEFT JOIN #SKSchedule SSCH          
        ON TSLT.ShopID = SSCH.ShopID
            AND TSLT.ShopKeeperID = SSCH.ShopkeeperID
            AND TSLT.ShopslotStart >= SSCH.ShopKeeperStart 
            AND TSLT.ShopslotEnd <= SSCH.ShopKeeperEnd 

    ORDER BY ShopID, ShopSlotStart, ShopKeeperID;

非常感谢你。节省了我很多时间。如果一个插槽可以有多个预订,您建议如何更改此设置。假设我的店主是一名医生,在30分钟的时间里最多可以看3个病人?那么我们如何调整它来找到一个位置呢?谢谢,非常感谢。节省了我很多时间。如果一个插槽可以有多个预订,您建议如何更改此设置。假设我的店主是一名医生,在30分钟的时间里最多可以看3个病人?那么我们如何调整它来找到一个位置呢?谢谢
ShopkeeperId    | ShopId  | ShopSlot Start  | ShopSlot Start    | Shopkeeper Avialable  |
----------------+---------+-----------------+-------------------+-----------------------+
2               | 1       | 900             |  915              |   1           |
2               | 1       | 915             |  930              |   1           |
2               | 1       | 930             |  1000             |   1           |
.
.
.

2           | 1         | 1200          |  1215             |       0           |
2           | 1         | 1215          |  1230             |       0           |
2           | 1         | 1230          |  1240             |       0           |
.
.
.
2           | 1         | 1400          |  1415         |   1       |
2           | 1         | 1415          |  1430         |   1       |
2           | 1         | 1430          |  1445         |   1       |
-- ================================================
-- GIVEN DATA - Table of ShopKeeper Schedule 
CREATE TABLE #SKSchedule (
    ShopKeeperId int
    , ShopKeeperStart int
    , ShopKeeperEnd int
    , ShopID int
    );

INSERT INTO #SKSchedule VALUES
(1            , 900                  , 1800              ,  1        )
,(2            , 900                  , 1200              ,  1        )
,(2            , 1400                 , 1700              ,  1        )
,(3            , 830                  , 1600              ,  2        )
,(4            , 845                  , 1630              ,  2        )
,(5           , 845                  , 1630              ,  4       )
;

-- ================================================
-- GIVEN DATA - Table of Shop opening times
CREATE TABLE #ShopOpenClose(
    ID int
    , ShopOpen int
    , ShopClose int
    , ShopID int
    );
INSERT INTO #ShopOpenClose VALUES
(1  , 900        , 1800      ,  1            )
,(2  , 900        , 1730      ,  2            )
,(3  , 830        , 1600      ,  3            )
,(4  , 845        , 1630      ,  4            );



-- ================================================
-- Extract a list of shopkeeper/shop combos into ShopkeeperShop table
CREATE TABLE #SKSHOP(
    ShopKeeperID int
    , ShopID int
    )
INSERT INTO #SKSHOP SELECT DISTINCT ShopkeeperID, ShopID from #SKSchedule;


-- ================================================
-- Create a table of all possible time slots in a day
CREATE TABLE #TIMESLOTS (
     TSStart int
    , TSEnd int
    );

    -- Variables for the four quarter-hours in an hour, starting at 0900
    DECLARE @AA int = 900, @BB int = 915, @CC int = 930, @DD int = 945, @EE int = 1000;
    DECLARE @PP int = 0;

    -- Loop to create 10 hours 09-10 through 18-19
    WHILE @PP < 900
    BEGIN
        INSERT INTO #TIMESLOTS  

        VALUES 
            ( @AA + @PP, @BB + @PP ) , (@BB + @PP, @CC + @PP ), ( @CC + @PP, @DD + @PP ), (@DD + @PP, @EE + @PP );

        SET @PP = @PP + 100;
    END;


-- ================================================
-- Create a table of all possible timeslots per shopkeeper/shop, taking
-- into account the shop opening hours

SELECT SKS.ShopKeeperID
    , SKS.ShopID
    , TSL.TSStart ShopSlotStart
    , TSL.TSEnd ShopSlotEnd
    INTO #SKSHTS
    FROM #SKSHOP SKS
    CROSS JOIN #TIMESLOTS TSL;

    -- Remove those timeslots that are outside the shop opening hours range
    DELETE SKS FROM
        #SKSHTS SKS
        JOIN #ShopOpenClose SOC
         ON 
            SKS.ShopID = SOC.ShopID
         AND (SKS.ShopSlotStart < SOC.ShopOpen
         OR SKS.ShopSlotEnd > SOC.ShopClose);




-- ================================================
-- Now report all the shopslots indicating shopkeepers'
-- availability based on the shopkeepers' times
SELECT 
     TSLT.ShopKeeperID
    , TSLT.ShopID
    , TSLT.ShopslotStart
    , TSLT.ShopslotEnd
    , CASE WHEN SSCH.ShopKeeperID IS NULL THEN 0 ELSE 1 END ShopKeeperAvailable

    FROM 
        #SKSHTS TSLT
        LEFT JOIN #SKSchedule SSCH          
        ON TSLT.ShopID = SSCH.ShopID
            AND TSLT.ShopKeeperID = SSCH.ShopkeeperID
            AND TSLT.ShopslotStart >= SSCH.ShopKeeperStart 
            AND TSLT.ShopslotEnd <= SSCH.ShopKeeperEnd 

    ORDER BY ShopID, ShopSlotStart, ShopKeeperID;