使用基于输入参数的Datetime值自动填充SQL表字段

时间:2015-12-21 16:14:21

标签: sql sql-server datetime stored-procedures dateadd

我的SQL表中有一个datetime字段。我创建了一个将count作为变量并为表生成记录的过程。如果计数为5,它将生成5条记录。我想要的逻辑是,当我提供5作为输入参数时,表中的日期时间字段应自动填充值

12/20/2015 9:00
12/20/2015 11:00
12/20/2015 13:00
12/20/2015 15:00
12/20/2015 17:00

因此,每次将记录插入表格时,都应添加2小时的时间。

6 个答案:

答案 0 :(得分:0)

递归CTEs是一种动态创建记录的方法。这里的关键是创建一个锚(这是CTE中的第一个SELECT,这是你的起点)。和退出检查(这是WHERE子句)。

如果您想一次创建超过100条记录,请阅读MAXRECURSION。

实施例

------------------ INPUT ------------------------
declare @start_date datetime = '01/01/2000 14:00'
declare @loops int = 5
-------------------------------------------------

declare @i int = 0
while (@i < @loops) begin 
    select dateadd(hour, @i * 2, @start_date)
    set @i = @i + 1
end

您还可以查看WHILE块。

答案 1 :(得分:0)

使用此代码:

.error(function (jqXHR, textStatus, errorThrown) {
    alert(jqXHR + "-" + textStatus + "-" + errorThrown);
})

答案 2 :(得分:0)

在没有 LOOP

的情况下尝试此操作
Declare @count int = 5,
        @incrementer int =2 -- in case if you want to change the incrementer 

SELECT Dateadd(hh, num * @incrementer, dates) 
FROM   (SELECT Cast(CONVERT(VARCHAR(20), Dateadd(dd, 1, Getdate()), 111) 
                    + ' 9:00 AM' AS DATETIME) AS Dates, 
               num 
        FROM   (VALUES(0),(1),(2),(3),(4),(5)) TC (num)) A 
WHERE  num <= @count - 1 

答案 3 :(得分:0)

Create Table dates
    (
    datetimefield datetime not null
    )
    go

Create Procedure FillDateTimeField
@insertxrows  int
AS
begin
Declare @LastDateTimeInserted as datetime
set @LastDateTimeInserted  = (select isnull(max(datetimefield),getdate()) from Dates)
;WITH norows AS (
  SELECT 1 as num, Dateadd(hour,2,@LastDateTimeInserted) as FirstRecord
  UNION ALL
  SELECT num + 1, dateadd(hour,2,firstrecord) FROM 
  norows
   WHERE num < @insertxrows
)
insert into dates
select firstrecord from norows
end

答案 4 :(得分:0)

请查看下面的示例代码,它包含您需要的逻辑。希望它有所帮助!!

--Create a temp table for sample output 
CREATE TABLE #temp
( 
CreatedDate datetime
)

--Declaring variables
DECLARE @Count int
DECLARE @TimeCounter int
--intializing values
SET @Count=5
SET @TimeCounter=0


WHILE(@Count>0)
BEGIN
--SELECT getdate()+1
insert into #temp(#temp.CreatedDate) Select DATEADD(hour,@TimeCounter,getdate())
SET @TimeCounter=@TimeCounter+2
SET @Count=@Count-1
END
--Final values
SELECT * FROM #temp tmp
--Dropping table
DROP TABLE #temp

答案 5 :(得分:0)

这是使用数字表/函数最好解决的问题之一。代码比递归或循环少得多,通常对于任何非平凡和更可重用的东西都更快。

您想要的核心代码是

CREATE PROCEDURE usp_PopulateAppointments
(
    @StartDateTime  datetime2(3),
    @Records        int,
    @Interval       int = 120       --Time between appointment slots in minutes. Default to 2h if not manually specified.
)

INSERT INTO Appointments
SELECT
    DATEADD(m, @Interval * Number, @StartDateTime)
FROM dbo.udfNumbers(0, @Recs)

我假设这是一个带@StartAt和@NumberResults的数字函数。我在http://dataeducation.com/you-require-a-numbers-table/的评论中使用了来自Adam的最终代码的一个 - 根据我的经验,它比真实的表更快,并且占用的空间更少。