2016-08-09 11 views
0

моя проблема заключается в следующем:SQL Server SUM DATEDIFF и NULL, если смотреть на записи между двумя датами

У меня есть таблица (называемая таблица) со столбцами: ID, событие, StartDate, ENDDATE

StartDate идет с 1900-01-01 по текущий день, enddate также. event - произвольная строка, и каждый идентификатор запускает и завершает несколько событий с течением времени (но только одно событие за раз).

Рассмотрите случай, когда мы хотим получить записи о датах между 1989-01-01 и 2000 годами -01-01 Мы хотим суммировать разницу между датами, чтобы получить общее количество недель, которые каждый идентификатор проводит, делая какое-либо событие.

Задача, которую я имею, заключается в том, что в данных, которые все еще находятся на каком-либо событии, меня интересует, поэтому их EndDate равна нулю.

в настоящее время я пытаюсь

SELECT 
    id, 
    ISNULL(enddate, 2000-01-01 sum(datediff(weeks, startdate, enddate)) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 

То, что я после:

Я хочу строк различных идентификаторов и каждый из них будет иметь соответствующий счет того, сколько недель они были на мероприятиях, представляющих интерес

на данный момент мой код (не совсем то, что я написал там) дает мне несколько строк для каждого идентификатора, суммируя каждый раз, какой они были в любом случае.

+2

Код, который вы показали нам даже не близко к возможности работать. Попробуйте создать самодостаточный пример ** runnable ** code (я бы предложил заполнить переменную таблицы несколькими строками данных, фактически запросив у нее предложение 'FROM', исправить все, что было, строка 'ISNULL' и т. д.) –

+0

Кроме того, вам нужно дать нам четкое определение того, какой результат вы ищете. 'DATEDIFF' подсчитывает * переходы *, и если мы предположим, что вы имели в виду« неделя », а не« недели », вы должны знать, что он может вернуть 1 для двух дат, которые находятся всего на один день, если первый - суббота, а второй есть воскресенье. Это то поведение, которое вы хотите? Нужно ли учитывать * частичные * недели здесь? –

+0

Да, частичное поведение отлично подходит для анализа, кроме того, я всегда могу сделать это днем, чтобы узнать, имеют ли данные смысл. Я знаю, что мой код как не запускается, я не на компьютере, чтобы получить доступ к серверу, и когда у меня нет доступа к Интернету, поэтому мне нужно писать заметки о ответе и применять Это. –

ответ

0

Необходимо, чтобы конечная дата не была нулевой в вашем аргументе where, а затем удаляла isnull вокруг нее в возвращаемых столбцах. Вам нужно сделать сумму вокруг датированного psrt. Извините, я нахожусь на своем телефоне, поэтому не могу столкнуться с тем, чтобы напечатать код. Если я помню, я откинусь назад, когда у меня будет клавиатура позже!

Также я согласен с тем, что вы должны использовать dd (дни) в вашем дате, иначе вы потеряете частичные недели. Вы всегда можете бросить его в десятичные драмах разделить сумму на 7,00

+0

include is notnull в моей статье where? но я хочу произвольно сказать, что NULLS - это дата 2000-01-01, потому что я в основном подсчитываю, сколько недель они были в какой-то группе событий во время окна дат. Я не хочу добавлять только нулевые даты, люди, у которых есть нулевые конечные даты, все еще находятся на мероприятии, и я хочу подсчитать, сколько недель они там были. –

0

Вы должны выполнить это ..

SELECT 
    id, 
    sum(datediff(weeks, startdate, ISNULL(enddate, '2000-01-01')) AS wksdoingstuff 
WHERE 
    event IN ('something', 'somethingelse'. 'anotherthing') 
    AND BETWEEN 1989-01-01 AND 2000-01-01 
GROUP BY 
    id 
+0

Большое спасибо –

+0

Это сработало отлично –