填充多个间隔的表

时间:2015-12-31 08:14:15

标签: sql sql-server tsql data-warehouse

我必须用时间内部填充这些表:

CREATE TABLE [dbo].[D_TIME_test](
    [DTMINUTES1] [datetime] NULL,
    [DTMINUTES5] [datetime] NULL,
    [DTMINUTES15] [datetime] NULL,
    [DTMINUTES30] [datetime] NULL,
    [DTMINUTES60] [datetime] NULL
) ON [PRIMARY]

所以我需要这样的表格:

enter image description here

我使用的一栏:

DECLARE @start DATETIME, @end DATETIME  

SET @start = '20120901';
SET @end = '20170101'; 

WHILE @start < @end
BEGIN
  INSERT INTO D_TIME_test
  VALUES (@start)

  SET @start = DATEADD(MINUTE, 1, @start)
END

如何更改此查询以填充上表?

2 个答案:

答案 0 :(得分:1)

试试这个

DECLARE @start DATETIME, @end DATETIME  

SET @start = '20151231 10:00';
SET @end = '20151231 15:00'; 

DECLARE @result_tbl TABLE(DTMINUTES1 DATETIME,
                          DTMINUTES5 DATETIME,
                          DTMINUTES15 DATETIME,
                          DTMINUTES30 DATETIME,
                          DTMINUTES60 DATETIME)

WHILE @start < @end
BEGIN
  INSERT INTO @result_tbl(DTMINUTES1, DTMINUTES5, DTMINUTES15, DTMINUTES30, DTMINUTES60)
  VALUES(@start, 
         DATEADD(mi, 
                 - DATEPART(mi, @start) % 5,
                 @start),
         DATEADD(mi, 
                 - DATEPART(mi, @start) % 15,
                 @start),
         DATEADD(mi, 
                 - DATEPART(mi, @start) % 30,
                 @start),
         DATEADD(mi, 
                 - DATEPART(mi, @start) % 60,
                 @start))

  SET @start = DATEADD(MINUTE, 1, @start)
END

SELECT * FROM @result_tbl

答案 1 :(得分:1)

您可以先执行脚本,然后使用

更新其他列
UPDATE D_TIME_test SET
  DTMINUTES5 = DATEADD(mi, (DATEDIFF(mi, 0, DTMINUTES1) / 5) * 5, 0)
, DTMINUTES15 = DATEADD(mi, (DATEDIFF(mi, 0, DTMINUTES1) / 15) * 15, 0)
, DTMINUTES30 = DATEADD(mi, (DATEDIFF(mi, 0, DTMINUTES1) / 30) * 30, 0)
, DTMINUTES60 = DATEADD(mi, (DATEDIFF(mi, 0, DTMINUTES1) / 60) * 60, 0)

或者您可以编辑添加其他列的脚本

DECLARE @start DATETIME, @end DATETIME  

SET @start = '20120901';
SET @end = '20170101'; 

WHILE @start < @end
BEGIN
  INSERT INTO D_TIME_test
  VALUES (@start
        , DATEADD(mi, (DATEDIFF(mi, 0, @start) / 5) * 5, 0)
        , DATEADD(mi, (DATEDIFF(mi, 0, @start) / 15) * 15, 0)
        , DATEADD(mi, (DATEDIFF(mi, 0, @start) / 30) * 30, 0)
        , DATEADD(mi, (DATEDIFF(mi, 0, @start) / 60) * 60, 0)
         )

  SET @start = DATEADD(MINUTE, 1, @start)
END

DATEADD(mi, (DATEDIFF(mi, 0, @start) / 60) * 60, 0)获取固定值(在本例中为0)和@start之间的分钟差异,并在将除法的余数除去60之后将其添加回相同的值

在SQL Server中,如果除法的两个部分都是整数类型,则结果也是整数类型,因此不需要使用FLOOR