Как получить разницу между двумя различными типами данных даты в MS SQL? - PullRequest
0 голосов
/ 14 июня 2019

Итак, у меня есть два столбца EnrollmentStartDate и EligibilityStartDate, и мне нужно получить разницу между ними (enroll - elibil), а затем получить среднее число дней, которое требуется клиенту, чтобы стать активным, с даты получения права.

Проблема в том, что EnrollmentStartDate в одной из таблиц имеет формат datetime2 , а EligibilityStartDate в другой таблице имеет формат date .

и я получаю следующую ошибку

Сообщение 8117, уровень 16, состояние 1, строка 16 Тип данных операнда datetime2 недопустим для оператора вычитания.

Есть ли способ преобразовать одно в другое? как мне это сделать?

    select clientid, avg(EnrollmentStartDate - EligibilityStartDate) as avg_daysFROM dbo.Client  inner join  dbo.ClientEnrollment ON dbo.Client.ClientId = dbo.ClientEnrollment.ClientId order by avg_days

Ответы [ 2 ]

1 голос
/ 14 июня 2019

DATEDIFF() должен справиться с этим:

select clientid,
       avg(datediff(day, EligibilityStartDate, EnrollmentStartDate) * 1.0
          )
. . .

* 1.0 означает, что среднее значение не рассчитывается как целое число.

0 голосов
/ 14 июня 2019
  1. Вы не можете выполнять арифметическую операцию вычитания в DATE и DATETIME2 типы данных. Вы должны использовать функцию DATEDIFF в SQL Сервер.
  2. Вам необходим GROUP BY, если вы вводите какой-либо столбец в SELECT вместе с функцией агрегирования
  3. Кроме того, рекомендуется использовать псевдонимы в таблицах, когда В запросе участвуют несколько таблиц для лучшей читаемости.

Предполагается, что столбцы EnrollmentStartDate и EligibilityStartDate находятся в таблице dbo.ClientEnrollment,

SELECT  C.ClientId
        ,avg_days = AVG(DATEDIFF(DAY, CE.EligibilityStartDate, CE.EnrollmentStartDate)) 
FROM    dbo.Client C
        INNER JOIN  dbo.ClientEnrollment CE
            ON C.ClientId = CE.ClientId 
GROUP   BY C.ClientId           
ORDER   BY avg_days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...