SQL - Использование Datediff в качестве запроса выполняется? - PullRequest
0 голосов
/ 04 мая 2010

Это мой первый пост, и я очень увлечен MSSQL, поэтому будьте осторожны: -)

У меня есть таблица, в которой я пытаюсь использовать datediff. Я думаю, что будет проще, если я сначала опубликую запрос и результаты

select mh.agetime, mh.whatid

from mailhistory mh
inner join mail m
 on mh.mailid=m.myid
where (mh.whatid=17 or mh.whatid=11 or mh.whatid=0) and maincontactid=287816 and mailid=276086

order by agetime

Действительно, maincontactid и mailid в данный момент находятся там только для того, чтобы ограничить результаты, пока я делаю запрос.

Результаты следующие ...

AGETIME                    WHATID
1899-12-30 00:00:00.000 0
1899-12-30 00:48:10.000 11
1899-12-31 02:16:49.000 17
1899-12-31 06:29:08.000 11
1900-01-18 15:31:40.000 17
1900-02-11 14:56:59.000 11

Я пытаюсь создать третий столбец при выполнении запроса, который создаст третий столбец, показывающий разницу в датах (в днях) ... между элементами с WHATID 11 и 17 ... так что я после результатов, как это:

AGETIME                    WHATID    DIFFERENCE
1899-12-30 00:00:00.000 0         NULL
1899-12-30 00:48:10.000 11        0
1899-12-31 02:16:49.000 17        1
1899-12-31 06:29:08.000 11        0
1900-01-18 15:31:40.000 17        18
1900-02-11 14:56:59.000 11        22

Что-то в этом роде ... Итак, есть ли способ преобразовать мой запрос, чтобы он выполнял такую ​​же дату?

Большое спасибо заранее!

Chris

1 Ответ

0 голосов
/ 04 мая 2010

Если вы используете SQL Server 2005 или выше, вы можете создать CTE и присвоить row_number текущему набору результатов. Затем вы можете присоединиться к CTE слева при помощи Current.Row_Num = Previous.Row_Num -1 и затем получить разницу в дате. Подход будет аналогичен показанному в этой ссылке:

http://www.kodyaz.com/articles/sql-select-previous-and-next-rows-with-current-row-in-tsql.aspx

Для SQL Server 2000

Предполагается, что в наборе результатов нет группировки:

Я бы, вероятно, создал бы переменную временной таблицы вместо CTE с Identity Filed (которая будет действовать как округленное число) и затем применил бы ту же логику, как описано выше для 2005 года. Вместо CTE мы будем использовать только серьезные изменения Переменная Temp Table и вместо rownumber мы будем использовать тождество во временной таблице.

...