SQL:在 2 部电影之间找到 space 并降低 space
SQL: find space between 2 movies and lower the space
我正在制作电影院预订应用程序。我必须制定一个对电影院有效的时间表。这意味着两部电影之间的时间 (space) 应该是 0。
我必须做的:我必须做一个功能,可以找到 2 部电影之间的最大 space 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
这是我的 table:
ShowTable
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
我正在制作电影院预订应用程序。我必须制定一个对电影院有效的时间表。这意味着两部电影之间的时间 (space) 应该是 0。
我必须做的:我必须做一个功能,可以找到 2 部电影之间的最大 space 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
这是我的 table: ShowTable
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