2017-06-04 57 views
1

我正在製作電影預訂應用程序。我必須制定一個對電影有效的時間表。這意味着兩部電影之間的時間(空間)應該爲0.SQL:查找2部電影之間的空間並降低空間

我必須做的:我必須製作一個功能,可以在兩部電影之間找到30分鐘的最大空間並將其設置回0,所以電影有完美的重疊。

因此,例如:

電影1:11:00 - 13:00

電影2:13:30 - 15:00

電影3:15:30 - 16:00

隨着功能的結果應該是:

電影1:11:00 - 13:00

電影2:13:00 - 15:00

電影3:15:00 - 16:00

這裏是我的表: ShowTable

+0

您能否提供將涉及一些示例數據的表的表結構? – Jason

+0

我添加了表格的圖片。其他表格不相關。他們沒有影響查詢的信息。 (比如:餐廳和電影只有一個RoomID和一個FilmId) – Alegou20

回答

1
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t(Movie varchar(10),Starttime TIME,EndTime time) 
INSERT INTO #t(Movie,Starttime,EndTime) 
SELECT 'Movie 1','11:00','13:00' UNION ALL 
SELECT 'Movie 2','13:30','15:00' UNION ALL 
SELECT 'Movie 3','15:30','16:00' 
UPDATE t SET t.Starttime=p.EndTime 
FROM #t AS t 
CROSS APPLY(SELECT MAX(tt.EndTime) AS EndTime FROM #t AS tt WHERE DATEDIFF(MINUTE,tt.EndTime,t.Starttime)>0) p 
WHERE p.EndTime IS NOT NULL 

SELECT * FROM #t 
 
Movie  Starttime  EndTime 
---------- ---------------- ---------------- 
Movie 1 11:00:00.0000000 13:00:00.0000000 
Movie 2 13:00:00.0000000 15:00:00.0000000 
Movie 3 15:00:00.0000000 16:00:00.0000000 

哪個版本你使用,如果你使用2012+ 你也可以使用LAG

SELECT *,LAG(EndTime)OVER(ORDER BY EndTime) AS NewStartTime FROM #t 
 
Movie  Starttime  EndTime   NewStartTime 
---------- ---------------- ---------------- ---------------- 
Movie 1 11:00:00.0000000 13:00:00.0000000 NULL 
Movie 2 13:30:00.0000000 15:00:00.0000000 13:00:00.0000000 
Movie 3 15:30:00.0000000 16:00:00.0000000 15:00:00.0000000 

我添加roomid爲採樣數據

IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t(ShowID int,RoomID int, Movie varchar(10),Starttime TIME,EndTime time) 
INSERT INTO #t(ShowID,RoomId,Movie,Starttime,EndTime) 
SELECT 1,1,'Movie 1','11:00','13:00' UNION ALL 
SELECT 3,1,'Movie 2','13:30','15:00' UNION ALL 
SELECT 4,1,'Movie 3','15:30','16:00' UNION ALL 
SELECT 2,2,'Movie 3','12:30','14:30' UNION ALL 
SELECT 5,2,'Movie 1','15:30','16:30' 
SELECT *,LAG(EndTime)OVER(partition by RoomId ORDER BY EndTime) AS NewStartTime FROM #t 
UPDATE t SET t.Starttime=isnull(p.NewStartTime,t.Starttime) 
FROM #t AS t 
inner join(
    SELECT *,LAG(EndTime)OVER(partition by RoomId ORDER BY EndTime) AS NewStartTime FROM #t 
) as p on t.ShowId=p.ShowId 

select * FROM #t AS t 

做了以下的結果是你想要的?

 

    ShowID RoomID Movie Starttime EndTime 
1 1 1 Movie 1 11:00:00 13:00:00 
2 3 1 Movie 2 13:00:00 15:00:00 
3 4 1 Movie 3 15:00:00 16:00:00 
4 2 2 Movie 3 12:30:00 14:30:00 
5 5 2 Movie 1 14:30:00 16:30:00 
+0

我使用的是2016版本!那個滯後的東西對我很有幫助,而且非常清楚!非常感謝你! – Alegou20

+0

如何以roomId訂購?我知道我可以這樣做:「Where RoomId =(x)」但是它只顯示x的roomId。但我需要顯示所有內容並按roomId排序,而不是「獲取最後一次」。從另一個房間Id .. – Alegou20

+0

你嘗試過'RoomId by RoomId'嗎? –