Обновлено - объявить значение и установить с другими результатами

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

Чтобы объяснить, у меня есть список номеров для отслеживания, и я хочу объявить «ShipDate» как «AddedDate», а после объявить «DueDeliveryDate» как «ShipDate» + дни в зависимости от того, в какой день он был отправлен.

Проблема здесь в том, что он обновит все номера отслеживания с той же датой, которая объявлена ​​первой как для «ShipDate», так и «DueDeliveryDate».

См. Код SQL:

begin tran
Declare @ShipDate varchar(max) = (Select cast(AddedDate as date) from
                                    (select distinct a.TrackingNumber, b.AddedDate 
                                     from ConTransaction a
                                     inner join Consignment b 
                                     on a.TrackingNumber = b.TrackingNumber
                                     where a.TrackingNumber in 
                                                          (
                                                          Select TrackingNumber                                                                    
                                                          from Consignment  C WITH (NOLOCK) 
                                                          Where ShipDate > DateAdd(d, 7, Convert(smalldatetime,Convert(Varchar(10),getdate(),126)))
                                                          AND [Status] = 0                                                     
                                                          ))part01)

Declare @DueDeliveryDate datetime 

Begin

if datename(weekday,@ShipDate)  = 'Friday' 
   set @DueDeliveryDate = dateadd(day,3,@ShipDate)
if datename(weekday,@ShipDate)  = 'Saturday' 
   set @DueDeliveryDate = dateadd(day,2,@ShipDate)
else
   set @DueDeliveryDate = dateadd(day,1,@ShipDate)


Update CN
Set ShipDate = @ShipDate
,DueDeliveryDate = @DueDeliveryDate
,UpdatedBy = 'IT ADMIN'
-- Select *    
FROM dbo.Consignment CN
Where cn.TrackingNumber in (
          select distinct a.TrackingNumber 
          from ConTransaction a
          inner join Consignment b 
          on a.TrackingNumber = b.TrackingNumber
          where a.TrackingNumber in (
                       Select TrackingNumber      
                       from Consignment  C WITH (NOLOCK) 
                       Where ShipDate > DateAdd(d, 7,Convert(smalldatetime,Convert(Varchar(10),getdate(),126))) 
                       and [Status] = 0                                                     
                       and TrackingNumber in ( '65560460605' , '50454646064')
                                            ))
end


--rollback tran

Вот фрагмент таблицы:

TrackingNumber | ShipDate            | UpdatedBy | AddedDate           | Status | DueDeliveryDate
65560460605    | 2018-08-10 00:00:00 | NULL      | 2018-08-06 00:00:00 | 0      | 2018-09-09 00:00:00
50454646064    | 2018-08-12 00:00:00 | NULL      | 2018-08-10 00:00:00 | 0      | 2018-09-10 00:00:00

Причина в том, что вы используете одно значение для @DueDeliveryDate и применяете его за одну операцию установки (то есть UPDATE). Вы можете опубликовать образцы данных? Логика должна быть реализована в операторе UPDATE, чтобы он работал с записью за записью.

squillman 10.08.2018 14:08

Итак, вы рассчитываете значения переменных один раз, а затем обновляете таблицу этими значениями. Неудивительно, что все затронутые записи имеют одни и те же значения. Каким-то образом даты должны быть относительно значения, хранящегося в таблице. Но, к сожалению, ваш вопрос не объясняет, какое значение должно быть. Попробуйте отредактировать вопрос и объяснить это.

sticky bit 10.08.2018 14:09

Так что «громоздкая» часть, в которой вы определяете @ShipDate, вероятно, является ключом к пониманию этого. В настоящее время у вас есть три ответа, но все они в значительной степени бесполезны, поскольку все, что они делают, это переписывают вашу плохую логику в другие формы ЖЕСТКОЙ плохой логики. Нам нужно увидеть, как вы вычисляете «AddedDate» как «ShipDate», поскольку это, вероятно, будет сутью проблемы.

Richard Hansell 10.08.2018 14:28

Я обновил вопрос

user9629702 10.08.2018 15:36

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

user9629702 10.08.2018 15:43
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы переписал его выражением case:

set @DueDeliveryDate = dateadd(day, (case datename(weekday,@ShipDate)
                                          when 'Friday' then 3
                                          when 'Saturday' then 2
                                          else 1 
                                     end), @ShipDate
                              )

update cm
     set ShipDate = @ShipDate,
         DueDeliveryDate = @DueDeliveryDate,
         UpdatedBy = 'IT ADMIN',
         UpdatedDate = getdate()  
from dbo.Consignment cn
where cn.TrackingNumber in ( **List of tracking number** ); 
Begin

Update CN
Set ShipDate = @ShipDate
,DueDeliveryDate = case 
   when datename(weekday,@ShipDate)  = 'Friday' 
         then dateadd(day,3,@ShipDate)
   when datename(weekday,@ShipDate)  = 'Saturday' 
        then dateadd(day,2,@ShipDate)
   else dateadd(day,1,@ShipDate) end
,UpdatedBy = 'IT ADMIN'
,UpdatedDate = getdate()
-- Select *    
FROM dbo.Consignment CN
Where cn.TrackingNumber in ( **List of tracking number** ) 

Спасибо, Четин, вы указали мне правильное направление, я опубликую правильное решение, и вы увидите, чего я пытался достичь.

user9629702 10.08.2018 15:43
Ответ принят как подходящий

См. Решение ниже:

UPDATE a
SET ShipDate = a.AddedDate             
,DueDeliveryDate = CASE
                  WHEN datename(weekday,a.AddedDate)  = 'Friday' THEN 
                  dateadd(day,3,a.AddedDate)
                  WHEN datename(weekday,a.AddedDate)  = 'Saturday' THEN 
                   dateadd(day,3,a.AddedDate) 
                  ELSE dateadd(day,1,a.AddedDate) 
                  END
,UpdatedBy = 'IT ADMIN'
,UpdatedDate = getdate()
-- Select *    
FROM dbo.Consignment a
Where 
TrackingNumber in 
(
SELECT DISTINCT a.TrackingNumber 
FROM ConTransaction a
INNER JOIN Consignment b 
ON a.TrackingNumber = b.TrackingNumber
WHERE a.TrackingNumber in (SELECT TrackingNumber  
                                FROM Consignment  C WITH (NOLOCK) 
                                WHERE ShipDate > DateAdd(d, 7, 
Convert(smalldatetime,Convert(Varchar(10),getdate(),126)))
                                AND [Status] = 0
                                AND TrackingNumber IN
                                         ( 65560460605,
                                           50454646064 )
                            )
)

* Поэтому я обновляю "ShipDate" с "AddedDate", а затем, в зависимости от дня, когда я обновлял "DueDeliveryDate", используя "AddedDate" *

Если кто-то может предложить другое название, это сделает этот вопрос немного лучше, не стесняйтесь, дайте мне знать, и я обновлю его.

Спасибо за вашу помощь!

Другие вопросы по теме