Использование Case When Then для фильтрации дат

#sql-server #tsql

#sql-server #tsql

Вопрос:

Мне нужно создать представление для моей группы учетных записей, чтобы показывать престарелых должников через Excel.

У меня есть сроки выполнения для всех неоплаченных счетов, и я хочу получить разбивку на 30,60,90 и 120 дней.

Мой текущий сценарий таков…

 CASE WHEN ST_TRANSMONTH = MONTH(GETDATE()) 
     then '30 Days' 
     else if ST_TRANSMONTH = MONTH(GETDATE())   30 = '60 DAYS' and so on. 
 

Я не могу заставить это работать, хотя помощь была бы признательна!

Комментарии:

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

2. В CASE нет ELSE IF, в нем просто есть несколько WHEN (и, возможно, еще один)

3. Вы, кажется, не смотрите на 30 дней, только если это текущий месяц?

Ответ №1:

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

Кроме того, у кого-то может быть более 30 дней, но вы не улавливаете это, потому что это другой месяц, например, они купили что-то 25 числа прошлого месяца, и сейчас 31-е число месяца, прошло> 30 дней, но вы не сообщаете об этомэто.

Вместо месяца используйте DATEDIFF команду, которая является частью TSQL. Это позволяет вам получить разницу между двумя датами для указанной единицы измерения:

 CASE
    WHEN ST_TRANSMONTH > DATEADD(DD, -30, GETDATE()) THEN '30 Days'
    WHEN ST_TRANSMONTH > DATEADD(DD, -60, GETDATE()) THEN '60 Days'
    -- add more cases as needed
END
 

Попробуйте вместо этого.

Удачи.

Комментарии:

1. 1: Хотя шаблон ST_TRANSMONTH > DATEADD(DD, -30, GETDATE()) THEN '30 Days' будет использовать немного меньше ЦП, применяя функции даты только к скалярной константе, а не к каждой строке в таблице.

2. @matbailie — Я обновил свой ответ, чтобы использовать ваши предложения. Еще раз спасибо!

Ответ №2:

Должно быть так:

 CASE WHEN ST_TRANSMONTH = MONTH(GETDATE()) THEN '30 Days' 
     WHEN ST_TRANSMONTH = MONTH(GETDATE())   1 = '60 DAYS' 
     WHEN ST_TRANSMONTH = MONTH(GETDATE())   2 = '90 DAYS' 
END as ColumnName
 

Комментарии:

1. У меня есть опасения по поводу использования месяца по причинам, которые я объясняю выше. Не все месяцы имеют длину 30 дней, и использование месяца для нечеткого сопоставления дней может привести к проблемам, включая потенциальные юридические проблемы, если они продолжат сбор против человека, который на самом деле не опаздывает, но, похоже, находится в отчете.

Ответ №3:

Кажется, вы храните только месяц, а не год? Тогда вы вряд ли сможете проверить, сколько дней / месяцев между двумя датами. Вам лучше хранить полную дату (или, по крайней мере, месяц год).

Если вы храните полную дату и действительно хотите проверять 30-дневные интервалы, вы можете

 select convert(varchar, datediff(day, st_date, getdate())/30*30)   ' days' from mytable
 

Если вы храните полную дату и хотите проверять только месячные интервалы, вы можете

 select convert(varchar, datediff(month, st_date, getdate())/30)   ' days' from mytable