Я задал этот вопрос и получил отличный ответ для mysql: Как назначить значение даты для всех возвращаемых запросов mysql , но теперь мне нужно сделать то же самое в MS SQL (SQL Server 2005).Предостережение заключается в том, что у меня есть конкретное заявление, которое, кажется, ломает вещи.У меня есть два запроса как таковых:
select * from (select row_number()
over (order by a.device ASC)
AS rownum, a.device, staff, requestDate, m.maxDate, attribute =
REPLACE((SELECT attribute AS [data()]
FROM deviceList
WHERE device = a.device
ORDER BY device FOR xml PATH('')), ' ', ' ')
FROM deviceList a
INNER JOIN (SELECT device, MAX(requestDate) AS maxDate
FROM ASSIGNMENT GROUP BY device) m on m.device = a.device
RIGHT JOIN Assignment
ON (Assignment.device=a.device)
GROUP BY a.device, staff, maxDate, requestDate, contract)
AS B WHERE B.rownum > 0;
select * from (select row_number()
over (order by a.device ASC)
AS rownum, a.device, staff, requestDate, CONVERT(
varchar, dateadd(year,
(CASE
WHEN contract = '10' THEN 1
WHEN contract = '20' THEN 2
WHEN contract = '30' THEN 3
ELSE 3
END), m.maxDate) 107) as myEndDate, attribute =
REPLACE((SELECT attribute AS [data()]
FROM deviceList
WHERE device = a.device
ORDER BY device FOR xml PATH('')), ' ', ' ')
FROM deviceList a
INNER JOIN (SELECT device, MAX(requestDate) AS maxDate
FROM ASSIGNMENT GROUP BY device) m on m.device = a.device
RIGHT JOIN Assignment
ON (Assignment.device=a.device)
GROUP BY a.device, staff, myEndDate, requestDate, contract)
AS B WHERE B.rownum > 0;
Первое утверждение прекрасно работает, например, записи (те, которые имеют одинаковую метку «устройства») имеют правильный endDate.Однако, когда я пытаюсь увеличить дату в соответствии с описанием дела, все идет не так, как надо.Дата увеличивается, но не совпадает.Почему оператор case нарушает все это?
ОБНОВЛЕНИЕ: Если у меня есть два значения дат для одного устройства как такового:
2/1/2010
1/1/2010
с контрактом = 10
после запроса соответствующие даты:
2/1/2011
2/1/2012