【问题标题】:Script to populate timeslot table with 1-hour timeslots用 1 小时时隙填充时隙表的脚本
【发布时间】:2021-08-10 11:02:11
【问题描述】:

我的架构中有表 => TimeSlot,它有几个属性,包括 id、开始时间、结束时间。 所以问题是:如何制作一个可以制作 23/24 记录的脚本,其中 starttime - endtime,例如 0.00-1.00、1.00-2.00 等。

我已经用一些例子试过了,但不知道如何编码(甚至不知道它是否正确):

SET NOCOUNT ON
TRUNCATE TABLE TimeSlot

DECLARE @InitHour TIME(0) = '1'
DECLARE @FinitHour TIME(0) = '24'

WHILE @InitHour < @FinitHour
BEGIN
    INSERT INTO TimeSlot(
        TimeSlotID, StartTime, EndTime
    )
    SELECT 

【问题讨论】:

  • SQL Server 有WHILE 循环。
  • @O.Jones OPs 代码有一个 WHILE 循环。我怀疑他们的问题是能够创造一个价值的开始和结束时间。
  • 确实如此,但这并不意味着你应该使用它们,@O.Jones。
  • 24:00:00 在 SQL Server 中暂时无效。

标签: sql sql-server


【解决方案1】:

最简单的解决方案是生成一个数字序列,您可以使用任何具有所需行数的表来执行此操作,并将row_number 用于任意数字序列。

with seq as (
    select top(24) Row_Number() over (order by (select null))-1 n
    from sys.syscomments
)
insert into TimeSlot (StartTime, EndTime)
select Convert(time,Concat(n,':00')) StartTime, 
       DateAdd(hour, 1, Convert(time,Concat(n,':00'))) EndTime
from seq

【讨论】:

    【解决方案2】:

    您的问题的基本答案是您需要以某种方式生成结果。有很多方法。如果您有一张至少有 24 行的桌子,那么您可以使用它。 “本机” SQL 方法使用递归 CTE>

    然后,TimeSlotID 应该会自动生成(通常作为标识列):

    WITH CTE as (
          SELECT convert(datetime, '01:00:00') as StartTime
          UNION ALL
          SELECT DATEADD(HOUR, 1, StartTime)
          FROM CTE
          WHERE StartTime < convert(datetime, '23:00:00')
         )
    INSERT INTO TimeSlot (StartTime, EndTime)
        SELECT StartTime, DATEADD(HOUR, 1, StartTime)
        FROM CTE;
    

    在这里提琴:http://sqlfiddle.com/#!18/9bac2/12

    【讨论】:

    • 我在小提琴中尝试过,但设置@inithour@FinitHour 不起作用。我会谦虚地编辑您的答案(比我的更聪明!)以使其按原样工作。
    • 她是我的桌子,周围有 24 排 (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) 现在开心吗?
    【解决方案3】:

    请检查此解决方案:http://sqlfiddle.com/#!18/4cb97/17

    set nocount on
    
    declare @hour int = 0
    
    while @hour <= 23
    begin
      declare @time datetime =
        convert(
          datetime,
          convert(varchar, @hour) + ':00:00'
        )
    
      insert into TimeSlot(StartTime, EndTime)
      values(
        @time, dateadd(hour, 1, @time)
      )
        
      set @hour = @hour + 1
    end
    
    select *
    from TimeSlot
    

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 2022-01-24
      • 1970-01-01
      • 2016-10-16
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多