Помогите составить запрос

CasperRUS
Дата: 14.09.2006 08:46:13
Всем привет.
Я что то второй день туплю: есть две таблицы T1(timest datetime, V11 float, v12 float...........) и T2(timest datetime, V21 float, v22 float...........)
у 1-й таблицы время записывается типа dd.mm.yyyy hh:mm:00 (то есть секунды нулевые), а у второй dd.mm.yyyy hh:mm:10 (то есть секунды 10).

Необходимо вытащить параметры во вьюху из обоих таблиц за максимальную дату (хотелось бы чтоб он время в разницу 10 секунд считал одинаковой, то есть вставлял в одну строчку)

Запрос:

declare @t datetime, @t2 datetime, @t1 datetime, @d datetime
set @d=getdate()
set @d=dateadd(second, -{fn second(@d)}, @d)
set @t=(select max(timest) from T1)
set @t1=dateadd(ss, -30, @t)
set @t2=dateadd(ss, 30, @t)
Select @d, v11, v12, v21, v22
FROM T1 FULL JOIN T2 on T1.TimeSt=T2.TimeSt
where (T1.timest between @t1 and @t2) or (T2.timest between @t1 and @t2)

Выдает 2 строчки - половина значений которой null

Подскажите, где туплю?
pavel73
Дата: 14.09.2006 09:00:11
надо преобразовать T1.TimeSt и T2.TimeSt к одному времени, т.е. convert ... + '00:00' и обратно в datetime и уже это делать on и в where может не or а and
CasperRUS
Дата: 14.09.2006 09:23:10
все еще не догоняю. структуру (дату) в исходных таблицах (Т1, Т2) менять нельзя.

как в подзапросе переконвертить дату на формат dd.mm.yyyy hh:mm:00?
Basill
Дата: 14.09.2006 09:27:59
Select @d, v11, v12, v21, v22
FROM T1
FULL JOIN T2
ON dateadd(second, -{fn second(T1.TimeSt)}, T1.TimeSt)=dateadd(second, -{fn second(T2.TimeSt)}, T2.TimeSt)
WHERE (T1.timest between @t1 and @t2) or (T2.timest between @t1 and @t2)
pavel73
Дата: 14.09.2006 09:29:56
CasperRUS
все еще не догоняю. структуру (дату) в исходных таблицах (Т1, Т2) менять нельзя.

как в подзапросе переконвертить дату на формат dd.mm.yyyy hh:mm:00?


про конвертировать можно фак посмотреть, и не в самом запросе, после from, и еще в условие соединение on наверно даже и не надо обратно в datetime
Basill
Дата: 14.09.2006 09:34:35
а еще лучше так:

Select TimeSt, Sum(v11) as v11, Sum(v12) as v12, Sum(v21) as v21, Sum(v22) as v22
FROM
(Select dateadd(second, -{fn second(TimeSt)}, TimeSt) as TimeSt, v11, v12, 0 as v21, 0 as v22
FROM T1 
UNION ALL
Select dateadd(second, -{fn second(TimeSt)}, TimeSt), 0 as v11, 0 as v12, v21,  v22
FROM T2 ) A
GROUP BY TimeSt
ORDER BY TimeSt DESC

Хотя если надо получить только одну строчку а таблицы большие, это будет не оптимальным решением
Горилла с Нижнего Тагила
Дата: 14.09.2006 09:34:57
может
declare @t datetime, @t2 datetime, @t1 datetime, @d datetime
set @d=getdate()
set @d=dateadd(second, -{fn second(@d)}, @d)
set @t=(select max(timest) from T1)
set @t1=dateadd(ss, -30, @t)
set @t2=dateadd(ss, 30, @t)
Select  @d, v11, v12, v21, v22
FROM T1 INNER JOIN T2 on T1.TimeSt=dateadd(ss,-10,T2.TimeSt)
where (T1.timest between @t1 and @t2) 
Горилла с Нижнего Тагила
Дата: 14.09.2006 09:43:06
set @d=dateadd(second, -{fn second(@d)}, @d)
set @t=(select max(timest) from T1)
set @t1=dateadd(ss, -30, @t)
set @t2=dateadd(ss, 30, @t)
Select  , v11, v12, v21, v22
FROM T1 INNER JOIN T2 on T1.TimeSt=dateadd(ss,-10,T2.TimeSt)
where T1.timest 
Горилла с Нижнего Тагила
Дата: 14.09.2006 09:45:46
может
declare @t datetime, @t2 datetime, @t1 datetime, @d datetime
set @d=getdate()
set @d=dateadd(second, -{fn second(@d)}, @d)
set @t=(select max(timest) from T1)
set @t1=dateadd(ss, -30, @t)
set @t2=dateadd(ss, 30, @t)
Select  @d, v11, v12, v21, v22
FROM T1 INNER JOIN T2 on T1.TimeSt=dateadd(ss,-10,T2.TimeSt)
where (T1.timest between @t1 and @t2) 
Горилла с Нижнего Тагила
Дата: 14.09.2006 09:46:26
Пардон, глюк.