Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 MIN и MAX дат группы записей.  [new]
viktor zelenin
Member

Откуда:
Сообщений: 185
Возникла проблема с получением запроса. Требуется получить самую минимальную дату и самую максимальную из всех записей.
Есть таблица:
declare @t as table(id int, processId int, begindate smalldatetime, enddate smalldatetime)
insert into @t(id, processId,begindate ,enddate) 
select 1, 1, '20010101','20050101' union all 
select 2, 1, '20080515',NULL union all
select 3, 2, '20050308','20050101' union all
select 4, 2, '20060711','20080101'


такой запрос:
MIN(YEAR(begindate)), MAX(YEAR(enddate)) from @t 

возвращает минимальный и максимальный год всех processId
2001, 2008,
но нужно вернуть во-первых, все года из диапазона, и во-вторых, если в enddate есть NULL, то это означает что по настоящую дату, т.е. по сегодняшний год, и по идее, запрос должен вернуть так:
2001
2002
2003
2004
2005
2006
2007
2008
2009 -- возвращаем текущий год, потому что в enddate есть NULL

как поправить запрос, чтобы по вернуть список лет и по NULL'y возвращало текущую дату(год)?
9 авг 09, 03:32    [7514841]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36814
join [Таблица со всеми годами]

Сообщение было отредактировано: 9 авг 09, 04:38
9 авг 09, 04:38    [7514853]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
viktor zelenin
Member

Откуда:
Сообщений: 185
не совсем понял, вот например таблица:
declare @y as table(years int)
insert into @y(years) 
select 1997 union all
select 1998 union all
select 1999

а запрос. чтоли так должен выглядеть?
SELECT MIN(YEAR(begindate)), MAX(YEAR(enddate)) from @t INNER JOIN @y
9 авг 09, 04:57    [7514862]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
Чемодан
Guest
TC
нужно вернуть во-первых, все года из диапазона
укажите, плз, тот резалтсет, который должен получиться по исходному скрипту
9 авг 09, 08:19    [7514879]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
viktor zelenin
Member

Откуда:
Сообщений: 185
Должно выйти два значения из таблицы:
declare @t as table(id int, processId int, begindate smalldatetime, enddate smalldatetime)
insert into @t(id, processId,begindate ,enddate) 
select 1, 1, '20010101','20050101' union all 
select 2, 1, '20080515',NULL union all
select 3, 2, '20050308','20050101' union all
select 4, 2, '20060711','20080101'

самая минимальная дата, и самая максимальная, но, если в enddate есть NULL, то брать за последнюю дату текущий локалтайм GetDate();
т.е. должно плулчится:
MinDate;MaxDate
20010101;20090809 --(сегодняшнее число, т.к. NULL присутствует в enddate)
9 авг 09, 09:13    [7514886]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
Чемодан
Guest
TC
если в enddate есть NULL, то брать за последнюю дату текущий локалтайм
Так, что ли ?
select begd=convert(char(4),min(begindate),121),endd=convert(char(4),max(isnull(enddate, getdate())),121) from @t
9 авг 09, 10:19    [7514904]     Ответить | Цитировать Сообщить модератору
 Re: MIN и MAX дат группы записей.  [new]
iljy
Member

Откуда:
Сообщений: 8711
viktor zelenin,

вы уж определитесь - вам надо два значения или список. Если два - вам уже все написали, а если список - попробуйте так:

select min_year + N
from
	(select year(min(date)) min_year, year(max(isnull(date, getdate()))) max_year from Data) t1
		join
	(select Number N from master..spt_values
	 where type = 'P') t2 on  N <= max_year - min_year
9 авг 09, 12:58    [7515006]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить