#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