Привет, я не уверен, возможно ли это так, как я собираюсь решить эту проблему, но если у вас есть решение или альтернативный способ преодолеть это, мы будем очень признательны.
Чтобы объяснить, у меня есть список номеров для отслеживания, и я хочу объявить «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
Итак, вы рассчитываете значения переменных один раз, а затем обновляете таблицу этими значениями. Неудивительно, что все затронутые записи имеют одни и те же значения. Каким-то образом даты должны быть относительно значения, хранящегося в таблице. Но, к сожалению, ваш вопрос не объясняет, какое значение должно быть. Попробуйте отредактировать вопрос и объяснить это.
Так что «громоздкая» часть, в которой вы определяете @ShipDate
, вероятно, является ключом к пониманию этого. В настоящее время у вас есть три ответа, но все они в значительной степени бесполезны, поскольку все, что они делают, это переписывают вашу плохую логику в другие формы ЖЕСТКОЙ плохой логики. Нам нужно увидеть, как вы вычисляете «AddedDate» как «ShipDate», поскольку это, вероятно, будет сутью проблемы.
Я обновил вопрос
Решил, дополню вопрос ответом. Я делал это труднее, чем нужно. Спасибо за вашу помощь. Как только вы увидите сценарий, станет ясно, что мне нужно было делать.
Я бы переписал его выражением 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** )
Спасибо, Четин, вы указали мне правильное направление, я опубликую правильное решение, и вы увидите, чего я пытался достичь.
См. Решение ниже:
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" *
Если кто-то может предложить другое название, это сделает этот вопрос немного лучше, не стесняйтесь, дайте мне знать, и я обновлю его.
Спасибо за вашу помощь!
Причина в том, что вы используете одно значение для @DueDeliveryDate и применяете его за одну операцию установки (то есть UPDATE). Вы можете опубликовать образцы данных? Логика должна быть реализована в операторе UPDATE, чтобы он работал с записью за записью.