2015-12-21 5 views
1

У меня есть поле datetime в моей таблице SQL. Я создал процедуру, которая принимает count как переменную и генерирует записи для таблицы. Если счетчик равен 5, он будет генерировать 5 records.The логики я хочу, что, когда я представить 5 в качестве входного параметра в поле даты и времени в таблице должны быть autofilled со значениямиПоле таблицы автозаполнения SQL со значением Datetime на основе входного параметра

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 часа времени.

+0

Мой плохой. Я использую MS SQL-Server –

+0

Начиная с ...? –

+0

Есть ли верхний и нижний предел количества записей, которые вы будете добавлять в любой момент? Также есть ли у вас какой-то код, который вы пробовали? –

ответ

0

Рекурсивный CTEs - один из способов создания записей на лету. Ключевым моментом здесь является создание привязки (это первый SELECT внутри CTE, который является отправной точкой). И проверка выхода (которая является предложением WHERE).

Прочитайте MAXRECURSION, если вы хотите создать более 100 записей за раз.

Пример

DECLARE @RecordsRequired INT = 5; 
DECLARE @BaseDateTime  SMALLDATETIME = GETDATE(); 


WITH [Sample] AS 
    (
     /* This CTE uses recursion to create the required number of 
     * records. 
     */ 
      SELECT 
       1    AS RowNumber, 
       @BaseDateTime AS [DateTime] 

     UNION ALL 

      SELECT 
       RowNumber + 1     AS RowNumber, 
       DATEADD(HOUR, 2, [DateTime]) AS [DateTime] 
      FROM 
       [Sample] 
      WHERE 
       RowNumber < @RecordsRequired 
    ) 
SELECT 
    RowNumber, 
    [DateTime] 
FROM 
    [Sample] 
; 

Вы также можете посмотреть в WHILE блоков.

0

Используйте этот код:

------------------ 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 
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 
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 
0

челобитных e найти пример кода ниже, он содержит необходимую вам логику. Надеюсь, поможет!!

--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 @[email protected]+2 
SET @[email protected] 
END 
--Final values 
SELECT * FROM #temp tmp 
--Dropping table 
DROP TABLE #temp 
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://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/you-require-a-numbers-table.aspx - по моему опыту он быстрее, чем реальная таблица, и занимает меньше места.

 Смежные вопросы

  • Нет связанных вопросов^_^