2016-06-28 2 views
0

Это мой сценарий. У меня есть таблица с FirstMaintenanceEventDate и некоторые данные повторяются через определенные дни с FirstMaintenanceEventDate. То, что мне нужно выяснить через запрос SQL Server, - это получить ближайшую дату каждой строки из них.Запрос SQL Server для получения ближайшей даты от повторяющихся событий

Ex: в прошлом месяце есть строка данных FirstMaintenanceEventDate, и она будет повторяться через 40 дней, следующего месяца. Точно так же здесь много событий. Некоторые из них имеют FirstMaintenanceEventDate в будущем. Из всех этих элементов мне нужно получить ближайшую дату для каждой строки.

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

Это мой запрос

SELECT TOP 1 * 
FROM FIS_MaintenanceEventInstance 
WHERE VehicleName = '600-GUR' 
    AND FirstMaintenanceEventDate >= GETDATE() 
ORDER BY FirstMaintenanceEventDate ASC 

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

SELECT TOP 1 * 
FROM FIS_MaintenanceEventInstance 
WHERE 
    VehicleName = '600-GUR' 
    AND FirstMaintenanceEventDate >= GETDATE() 
    AND CASE 
      WHEN FirstMaintenanceEventDate < GETDATE() 
       THEN (Getdate() + RecurringDays) 
     END 
ORDER BY FirstMaintenanceEventDate ASC 

Любое предложение будет оценено по достоинству.

ПРИМЕЧАНИЕ. Если вам нужна дополнительная информация, пожалуйста, позвольте мне сейчас.

EDITED Я попытался выполнить запрос, как предложил Джатин Пател в своем ответе ниже.

SELECT TOP 1 *, 
    CASE WHEN FirstMaintenanceEventDate < GETDATE() THEN DateAdd(day,RecurringDays,FirstMaintenanceEventDate) 
    ELSE FirstMaintenanceEventDate END AS MaintenanceEventDate 
FROM FIS_MaintenanceEventInstance 
WHERE VehicleName ='600-GUR' 
ORDER BY MaintenanceEventDate ASC 

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

+1

Теперь вы говорите о '' mysql' или mssql'? Вы смешиваете оба имени ... – arkascha

+1

Если у вас есть 'FirstMaintenanceEventDate> = GETDATE()' в предложении 'WHERE', то выражение в' CASE': 'WHEN FirstMaintenanceEventDate

+0

@arkascha Извините, если я вас смутил. Это mssql. –

ответ

0

Попробуйте это,

SELECT TOP 1 *, 
    CASE WHEN FirstMaintenanceEventDate < GETDATE() THEN (Getdate()+RecurringDays) ELSE FirstMaintenanceEventDate END AS MaintenanceEventDate 
FROM FIS_MaintenanceEventInstance 
WHERE VehicleName ='600-GUR' 
ORDER BY MaintenanceEventDate ASC 
+0

Спасибо. Ваш ответ близок к моему требованию. Но здесь «(Getdate() + RecurringDays)» должен измениться на «(FirstMaintenanceEventDate + RecurringDays)». Когда я попробовал это, у меня возникла ошибка: «Столкновение типа Operand: дата несовместима с int». «FirstMaintenanceEventDate» - это тип даты. Есть ли у вас идеи, чтобы это сделать? –

+1

я мог исправить это как «SELECT TOP 1 *, случай, когда FirstMaintenanceEventDate

+0

Я не уверен, что правильно понял, но если вы хотите сказать, что дата FirstMaintenanceEventDate вводится только один раз для события, и вам нужно рассчитать его повторяющееся событие до ближайшей будущей даты, чем заменить это «DateAdd (day, RecurringDays, FirstMaintenanceEventDate) "с " DateAdd (день, RecurringDays * (DateDiff (день, FirstMaintenanceEventDate, GetDate())/RecurringDays + 1), FirstMaintenanceEventDate) " –

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