Обновить список в SQL с добавочными датами, используя один оператор? - PullRequest
2 голосов
/ 05 января 2012

Я пишу заявление об обновлении, в котором мне нужно обновить список элементов сразу с добавочными датами.Инкрементальное значение определяется пользователем.Я нашел пример, который очень похож на мои потребности на http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx, но не знаю, как бы я его реализовал.Вот пример:

DECLARE @counter int
SET @counter = 0
UPDATE #tmp_Users
SET @counter = counter = @counter + 1

Мой текущий оператор:

strSQL.CommandText = "Update tblItem set item_timed_close=convert(datetime, @item_timed_close),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ) Where item_sale_id=@item_sale_id";
  strSQL.Parameters.Add(new SqlParameter("@item_timed_close", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_timed_close", DataRowVersion.Current, datetime_Var.AddMinutes(minutes_Var += Increments_var)));
  strSQL.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId3_Var));

datetime_Var определяется пользователем и имеет формат DateTime.minutes_Var равно нулю, чтобы начать с.Increments_var определяется пользователем.Мне нужно item_timed_close для увеличения на любое значение, установленное для Increments_var.

РЕДАКТИРОВАТЬ

Результаты, которые я ищу, будут выглядеть примерно так:

Пользователь указывает начальную дату 2012-01-08 12:00:00 PM и приращение 10 секунд.Для каждой обновленной строки дата будет выглядеть следующим образом:

2012-01-08 12:00:00 PM
2012-01-08 12:00:10 PM
2012-01-08 12:00:20 PM
2012-01-08 12:00:30 PM
2012-01-08 12:00:40 PM
2012-01-08 12:00:50 PM
2012-01-08 12:01:00 PM
2012-01-08 12:01:10 PM
2012-01-08 12:01:20 PM

Первая дата может даже иметь добавленное значение, уже добавленное к ней, для всех нас, если только оно увеличивается.Я мог бы изменить начальную дату начала с учетом этого с помощью кода.

Обновление

С предложением Naval я попытался выполнить подзапрос.Сначала я установил для всех полей даты значение NULL.Затем я запустил следующий запрос:

        strSQL3.CommandText = "Update tblItem set item_timed_close=DATEADD(minute,((Select count(*) as Count From tblItem Where item_sale_id=@item_sale_id And item_timed_close Is NULL) * @increment),convert(datetime, @item_timed_close)),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ) Where item_sale_id=@item_sale_id";
        strSQL3.Parameters.Add(new SqlParameter("@item_timed_close", SqlDbType.VarChar, 100, ParameterDirection.Input, true, 0, 0, "item_timed_close", DataRowVersion.Current, datetime_Var));
        strSQL3.Parameters.Add(new SqlParameter("@item_sale_id", SqlDbType.Int, 5, ParameterDirection.Input, true, 0, 0, "item_sale_id", DataRowVersion.Current, itemSaleId3_Var));
        strSQL3.Parameters.Add(new SqlParameter("@increment", SqlDbType.Int, 5, ParameterDirection.Input, true, 0, 0, "increment", DataRowVersion.Current, Increments_var));

Я надеялся, что смогу умножить подзапрос на переданную переменную, но он не сработал, как ожидалось.Кажется, умножить @increment на 1 для каждого поля.Я запустил оператор select один, и он возвращает 471. Так что я знаю, что эта часть работает правильно.Нужно ли разыгрывать Count как целое число или что-то еще?

DONE

Я наконец получил его.Сначала я должен был подумать об этом .... Мне пришлось изменить переменную счетчика в обычной последовательности Set моей строки обновления.Вот мой рабочий запрос.

 Declare @auto Int 
 Set @auto = 0 

 Update tblItem 
    set item_timed_close = DATEADD(minute, (@auto * @increment), convert(datetime, @item_timed_close))
      , item_timed_start = convert(money, 
                case when item_est_lo < 500  then ((convert(int, item_est_lo+25)/50)*50) 
                     when item_est_lo < 1000 then ((convert(int, item_est_lo+50)/100)*100) 
                     when item_est_lo < 3000 then ((convert(int, item_est_lo+125)/250)*250) 
                     when item_est_lo < 5000 then ((convert(int, item_est_lo+250)/500)*500) 
                     else ((convert(int,item_est_lo+12.5)/25)*25) end )
      , @auto = (@auto + 1) 
  Where item_sale_id=@item_sale_id

Итак, я использовал оригинальный пример, который нашел, и просто взял последнюю часть Set @counter и вставил ее в параметры set моей строки обновления.

Ответы [ 3 ]

1 голос
/ 06 января 2012

Попробуйте: ... я пишу запрос, вы конвертируете его в формат вашей базы данных.

Обновить имя таблицы Set DateD = DateAdd ('MI', (ID * 10), '01-Jan-2011 00:00:00')

Столбец идентификатора - это идентификатор поля идентификатора (AutoIncrement). ID * 10 = умножение его на 10, чтобы получить другое время / дату.

Я думаю, что это будет работать:)

Береги себя:)

1 голос
/ 12 января 2012

Я наконец получил это. Сначала я должен был подумать об этом ... Мне пришлось изменить переменную счетчика в обычной последовательности Set моей строки обновления. Вот мой рабочий запрос.

 Declare @auto Int Set @auto = 0 Update tblItem set item_timed_close=DATEADD(minute,(@auto * @increment),convert(datetime, @item_timed_close)),item_timed_start=convert(money, case when item_est_lo < 500 then ((convert(int,item_est_lo+25)/50)*50) when item_est_lo < 1000 then ((convert(int,item_est_lo+50)/100)*100) when item_est_lo < 3000 then ((convert(int,item_est_lo+125)/250)*250) when item_est_lo < 5000 then ((convert(int,item_est_lo+250)/500)*500) else ((convert(int,item_est_lo+12.5)/25)*25) end ),@auto = (@auto + 1) Where item_sale_id=@item_sale_id

Итак, я использовал оригинальный пример, который нашел, и просто вынул последнюю Set @counter часть и поместил ее в параметры set моей строки обновления.

1 голос
/ 05 января 2012

strSQL.Parameters.Add( не место для логики приращения. В соответствии с примером, попробуйте включить это в ваше заявление об обновлении. Сначала добавьте еще один параметр для Increments_Var и используйте DATEADD в вашем операторе обновления, чтобы добавить его в @item_timed_close, одновременно обновляя @item_timed_close до новой суммы. Я бы предложил начать с чего-то простого, в котором вместо целых чисел используются образец и даты, а затем построить его оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...