Рассчитать время от даты начала в SQL - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь подсчитать количество учетных записей с уникальным идентификатором, которые активны более года, а также указать, как долго каждая из них активна. Проблема с кодом, который у меня есть, состоит в том, что он не включает учетные записи, которые в настоящее время активны (те, у которых нет даты окончания). Например, если начальная дата была 01 мая 2018 года, но не имеет конечной даты, поскольку она активна в данный момент, ее также следует включить в этот запрос. Вот что у меня есть до сих пор ..

SELECT UniqueID,
DATEDIFF(yy, Begin_Date,End_Date) as timeactive
FROM TABLE
WHERE DATEDIFF(yy, Begin_Date,End_Date) > 1

Я хочу, чтобы мой вывод выглядел как ...

Unique ID    Time active
F000012      2.5
F000031      1.5

Вот что сработало:

SELECT UniqueID,
    CAST(ROUND(DATEDIFF(day, Begin_Date, COALESCE(End_Date, getdate()))/365.0, 1, 0) AS NUMERIC (10,1)) as timeactive
    FROM TABLE
    WHERE DATEDIFF(day, Begin_Date, COALESCE (End_Date, getdate())) >= 365

Ответы [ 3 ]

2 голосов
/ 08 апреля 2020

Если EndDate равен нулю, то выход функции DateDiff будет нулевым, а любое значение null по сравнению с чем-либо (даже с другим нулем) будет результатом нулевого значения (обычно интерпретируемого как false)

Я предлагаю вы используете COALESCE для преобразования даты окончания в сегодняшнюю дату, если она равна нулю:

SELECT 
  UniqueID,
  DATEDIFF(yy, Begin_Date,COALESCE(End_Date, GetUtcDate()) as timeactive
FROM TABLE
WHERE DATEDIFF(yy, Begin_Date,COALESCE(End_Date, GetUtcDate()) > 1

Следует иметь в виду, что используемая здесь функция DATEDIFF в SQLserver НЕ возвращает количество времени, прошедшее между две даты. Он возвращает количество раз, которое именованный интервал изменялся между двумя датами

Например, DATEDIFF(year, 2000-01-01, 2000-12-31 23:59:59) вернет 0, потому что это оба 2000 года, даже если они всего на одну секунду меньше года. , Если вы сделаете DATEDIFF(year, 2000-12-31 23:59:59, 2001-01-01 00:00:01), даже если эти даты находятся на расстоянии только в две секунды, datediff сообщит о них как об интервале в 1 год, потому что номер года изменился с 2000 на 2001.

DATEDIFF подсчитывает единицу каждый раз, когда вращаются часы после изменения интервала, и в этом случае интервал будет Год

Чтобы ваши даты были представлены как 1,5 года и c, вы должны рассмотреть возможность датировки по меньшему интервалу и деления, например, запросить разницу в ДНЯХ. между двумя датами, а затем делить на 365,25 - среднее количество дней в году. Чем меньше интервал, который вы запрашиваете у datediff, тем точнее будет результат, но он никогда не будет равен 100%. Если вы ставите результаты после одного десятичного знака года, то дни будут достаточно точными

Чтобы получить 1 десятичное место, приведите к цифре c с 1 DP:

SELECT 
  UniqueID,
  CAST(DATEDIFF(day, Begin_Date,COALESCE(End_Date, GetUtcDate())/365.25 AS NUMERIC(5,1)) as timeactive
FROM TABLE
WHERE DATEDIFF(day, Begin_Date,COALESCE(End_Date, GetUtcDate()) >= 365
2 голосов
/ 08 апреля 2020

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

SELECT UniqueID,
       DATEDIFF(month, Begin_Date, COALESCE(End_Date, GETDATE())) / 12.0 as timeactive
FROM TABLE
WHERE Begin_Date < DATEADD(YEAR, -1, COALESCE(End_Date, GETDATE()))

Обратите внимание на изменение в предложении WHERE. DATEDIFF() подсчитывает количество границ года между датами. Таким образом, разница в годах между 2019-01-01 и 2020-12-31 такая же, как разница между 2019-12-31 и 2020-01-01 - точно 1.

1 голос
/ 08 апреля 2020

Рассмотрим:

SELECT 
    UniqueID,
    DATEDIFF(yy, Begin_Date, COALESCE(End_Date, getdate()) as timeactive
FROM TABLE
WHERE DATEDIFF(yy, Begin_Date, COALESCE(End_Date, getdate()) > 1 

Это работает, используя текущую дату в качестве значения по умолчанию для пустых End_Date с. Таким образом, это разрешает записи с пустой датой окончания, если их дата начала более одного года go.

...