您还可以为此使用递归 CTE 以避免创建辅助表:
WITH "CTE"
AS
(
SELECT "id", "starttime" FROM "data"
UNION ALL
SELECT "id", DATEADD( MINUTE, 15, "starttime" )
FROM "CTE"
WHERE "starttime" < ( SELECT "endtime" FROM "data" AS D2 WHERE D2."id" = CTE."id" )
)
SELECT * FROM "CTE"
ORDER BY "ID"
请参阅SQL-Fiddle-Demo!
上述查询还假设数据表中的开始时间和结束时间组合的差异可以被 15 整除。
我已经编辑了查询以使用不能被 15 整除的日期时间 - 如果您选择的 15 分钟间隔不适合最后计算的间隔,它将被拒绝:
WITH "CTE"
AS
(
SELECT "id", "starttime" FROM "data"
UNION ALL
SELECT "id", DATEADD( MINUTE, 15, "starttime" )
FROM "CTE"
WHERE "starttime" <= ( SELECT DATEADD( MINUTE, -15, "endtime" ) FROM "data" AS D2 WHERE D2."id" = CTE."id" )
)
SELECT * FROM "CTE"
ORDER BY "ID"
如果您想在结果中拒绝最后一个时间戳(在 fiddle-demo 中id 2, timestamp "12:00:00"
),只需更改<=
为<
. 如果您正在使用半开区间,这也将是相关的。
请参阅已编辑的 SQL-Fiddle-Demo