Как рассчитать разницу дат в годах и месяцах в SQL Server?

#tsql #sql-server-2017

#tsql #sql-сервер-2017

Вопрос:

Я пытаюсь рассчитать оценку частоты в SQL Server, и я использую следующие запросы для получения результатов,

 FORMAT(DATEADD(month,-66, DATEADD(dd, 0,DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0))), 'd','us') --For -5.5 years Frequency

FORMAT(DATEADD(month,-6, DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, DATA_ASOF_TSTMP), 0))), 'd','us') --For -6 Months Frequency
 

Я получил следующие результаты

 5.5_Years_Frequency    6_Months_Frequency
          4/1/2015             3/30/2020
 

Для частоты -6 месяцев я получил конечную дату как 3/30/2020, но в марте 31 день, поэтому я хочу, чтобы результат был 3/31/2020 вместо 3/30/2020, как показано ниже.

Ожидаемые результаты,

 5.5_Years_Frequency    6_Months_Frequency
          4/1/2015              3/31/2020
 

Может ли кто-нибудь, пожалуйста, помочь мне получить ожидаемые результаты?

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

1. Ваш вопрос неясен. Не могли бы вы описать попытку вычисления словами, пожалуйста? Равна ли «6-месячная частота» «получить дату окончания квартала, которая наступает за 3 квартала до текущего квартала»?

2. Да, вы правы. Но когда я вычислил -6 месяцев с текущего квартала, я получаю конечную дату как 3/30/2020, но в марте 31 день, и я должен получить 3/31/2020 вместо 3/30/2020.

3. Добавлен ответ для 6-месячной частоты, но ваш текущий и ожидаемый результат для «5,5-летней частоты» совпадает с вашим вопросом? А 1 апреля — это дата начала квартала, поэтому она не соответствует определению 6-месячной частоты (которая дает конечную дату ).

4. Да, но для частоты 5,5 лет мне не нужна дата окончания квартала, это должен быть день начала следующего квартала, и именно так бизнес попросил нас создать логику.

5. Хорошо, тогда вы можете просто удалить dateadd(dd, 0, из расчета 😉

Ответ №1:

Измените порядок расчета:

  1. Определите квартал
  2. Вычтите 6 месяцев
  3. Вычтите 1 день

Периодичность в течение 6 месяцев:

 select FORMAT(DATEADD(dd, -1, DATEADD(month,-6, DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0))), 'd','us');
 

Скрипка