Как отличить if разницу между датами в weekly от monthly?

#sql-server

#sql-server

Вопрос:

У меня есть таблица, в которой сохраняются данные о кредите сотрудника. Некоторые сотрудники получают ссуду еженедельно и хотят возвращать каждый взнос еженедельно, а некоторые хотят возвращать взносы ежемесячно. Я хочу получить общую продолжительность периода кредитования, если сотрудник желает возвращать платежи еженедельно, тогда он должен выдавать результат типа 5 Weeks или 10 Weeks , но если сотрудник желает возвращать платежи ежемесячно, он должен выдавать результат типа 4 Months или 15 Months .

Вот примерные данные

 LoanID   DueDate     AmountToBePaid
2        2019-01-01  500
2        2019-01-07  500
2        2019-01-14  500
2        2019-01-21  500
2        2019-01-28  500

3        2019-01-01  1500
3        2019-02-01  1500
3        2019-03-01  1500
3        2019-04-01  1500
  

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

 SELECT 
  LoanId,
  DATEDIFF(WEEK, inst_start, inst_end) weeks 
FROM LoanMaster LM
INNER JOIN (
  SELECT 
      dateadd(month, -1,min(duedate)) inst_start, 
      max(duedate) inst_end
  FROM LoanDetail
) LD
ON LM.ID = LD.LoanID
  

Выход должен быть похожим:

 LoanId   Duration
2        4 Weeks
3        3 Months
  

Ответ №1:

Если ваши данные строго следуют правилу, согласно которому для одного и того же LoanID соответствующими датами будут либо только последовательные недели, либо только последовательные месяцы, тогда мы можем вывести период, разделив диапазон на количество строк:

 SELECT 
    LoanID,
    case
        when datediff(month,min(DueDate),max(dueDate))=count(*)-1 
            then str(datediff(month,min(DueDate),max(dueDate))) ' Months'
        else
            str(datediff(week,min(DueDate),max(dueDate))) ' Weeks'
    end as Duration
FROM  LoanMaster LM
GROUP BY LOANID