sql >> データベース >  >> RDS >> Mysql

期間が完全にカバーされているかどうかを確認するSQL要求

    編集: MySQLが機能するSQLフィドルについてはこちらをご覧ください: SQLFiddle 、今回は実際に正しく機能します:-)

    これらを試してください。肝心なのは、Shortfall > 0の場合です。 その後、レンタルを予約することはできません。

    MSSQL -これが私がそれを解決した方法です

    DECLARE @start DATETIME = '2013-04-29' -- this will depend on your dateformat
    DECLARE @end DATETIME = '2013-05-10'
    DECLARE @days INT = DATEDIFF(D,@start, @end) -- this is how many days we actually want to stay
    DECLARE @unusedDays INT = 0 -- this will be the number of unused days from the rental periods in which our start and end dates fall
    SELECT  @UnusedDays = DATEDIFF(D,@end,end_at) FROM PERIODS WHERE (@end > start_at AND @end <= end_at) -- how many spare days are there in the final period?
    SELECT  @UnusedDays = @UnusedDays + DATEDIFF(D,start_at, @start) FROM PERIODS WHERE (@start >= start_at AND @start < end_at) -- how many spare days are there in the start period?
    SELECT  @days + @UnusedDays - SUM(DATEDIFF(D,start_at,end_at)) AS Shortfall, -- total shortfall in days. Zero if we are okay to rent
            SUM(DATEDIFF(D,start_at,end_at)) AS AvailableDays, -- total number of days available in all periods covering our chosen rental period
            @days AS DesiredDays, -- number of days we want to rent
            @UnusedDays AS WastedDays -- number of wasted days (if we start or end our rental mid-period)
    FROM    PERIODS 
    WHERE   (@start >= start_at AND @start < end_at) -- period in which our selected rental starts
    OR      (end_at < @end AND start_at > @start) -- period completely within our selected rental
    OR      (@end > start_at AND @end <= end_at) -- period in which our selected rental ends
    

    これにより、次のような出力が提供されます:

    -- if you have @start = '2013-05-05'
    -- and @end = '2013-05-13'
    -- then you get
    Shortfall AvailableDays DesiredDays WastedDays
    
    0---------10------------8-----------2---------
    
    -- if you have @start = '2013-04-29'
    -- and @end = '2013-05-10'
    -- then you get
    Shortfall AvailableDays DesiredDays WastedDays
    
    5---------6-------------11----------0---------
    

    MySQL -これはあなたが実際に欲しいものです

    SET @start = '2013-04-29';
    SET @end = '2013-05-10';
    SET @days = DATEDIFF(@end, @start); -- this is how many days we actually want to stay
    SET @UnusedDays = 0; -- this will be the number of unused days from the rental periods in which our start and end dates fall
    SELECT  @UnusedDays := DATEDIFF(end_at,@end) FROM PERIODS WHERE (@end > start_at AND @end <= end_at); -- how many spare days are there in the final period?
    SELECT 'hello';
    SELECT  @UnusedDays := @UnusedDays + DATEDIFF(@start, start_at) FROM PERIODS WHERE (@start >= start_at AND @start < end_at); -- how many spare days are there in the start period?
    SELECT 'hello';
    SELECT  @days + @UnusedDays - SUM(DATEDIFF(end_at, start_at)) AS Shortfall, -- total shortfall in days. Zero if we are okay to rent
            SUM(DATEDIFF(end_at, start_at)) AS AvailableDays, -- total number of days available in all periods covering our chosen rental period
            @days AS DesiredDays, -- number of days we want to rent
            @UnusedDays AS WastedDays -- number of wasted days (if we start or end our rental mid-period)
    FROM    PERIODS 
    WHERE   (@start >= start_at AND @start < end_at) -- period in which our selected rental starts
    OR      (end_at < @end AND start_at > @start) -- period completely within our selected rental
    OR      (@end > start_at AND @end <= end_at); -- period in which our selected rental ends
    


    1. 1つのテーブルの同じ列にある2つの外部キー

    2. OracleのNULLIF()関数

    3. SQL ServerCE4.0のパフォーマンスの比較

    4. Docker内のホストのlocalhostとpostgresの違い