首页 > 解决方案 > 生成可变时间步长

问题描述

你好,社区。

我正在尝试编写一个存储过程,该过程将在几分钟内用时间集群填充维度表。例如集群 = 30: 00:00-00:29、00:30-00:59、01:00-01:29 等等。

到目前为止,我想不出更好的解决方案,只能使用提供的步骤循环超过 24 小时,当时间超过 00:00 并重新开始时,存在无限循环的危险。

在寻找可能的解决方案时,我找到了一个优雅的解决方案:https ://stackoverflow.com/a/10986763/12197757 ,但没有弄清楚如何使其适应不同的时间步长。

*编辑:由于我正在处理 Azure Synapse SQL 池,因此无法使用序列生成和递归 CTE。

标签: sqltsqlazure-synapse

解决方案


你可以使用递归 cte

; with rcte as
(
    select  tm = cast('00:00' as time(0))    -- start time
    union all
    select  tm = dateadd(minute, 30, tm)     -- 30 mins increment
    from    rcte
    where   tm  < '12:00'                    -- end time
)
select  *
from    rcte

计数表方法

declare @st time(0) = '00:00',
        @en time(0) = '03:30';
 
with tally (n) as
(
    -- 1000 rows
    select row_number() over(order by (select null)) - 1
    from (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n)
    cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
    cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
)
SELECT  tm = dateadd(minute, n * 30, @st)
FROM    tally
where   n   <= datediff(minute, @st, @en) / 30

推荐阅读