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

Откуда:
Сообщений: 19
Уважаемые форумчане!

Подскажите решение с построением запроса.
Есть таблица Flight с полями (тип time(7)) BlockStart - время старта и BlockEnd - время окончания.
Так же есть таблица RPlane с полем (тип int) StartTTSN - начальное значение.
Вычисления в минутах.
1) Высчитываю разницу между "BlockStart - время старта и BlockEnd - время окончания".

SELECT
(CASE 
WHEN F.BlockStart<F.BlockEnd then ((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd)) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
WHEN F.BlockStart>F.BlockEnd then (((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd))+1440) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
END)
FROM Flight F JOIN RPlane RP
ON F.ID_RPlane = RP.ID_RPlane
where F.ID_RPlane =1 AND FillingDate BETWEEN RP.StartDate AND GETDATE()


2) Нужно к "StartTTSN - начальное значение" прибавлять разницу.
К примеру StartTTSN = 48634, разница "BlockStart - время старта и BlockEnd - время окончания" = 61 минута, значит в строке таблицы Flight должно быть 48695 и так далее...

Как так сделать?
7 июл 14, 17:54    [16271159]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ac1-caesar,

SELECT
RP.StartTTSN + (CASE 
WHEN F.BlockStart<F.BlockEnd then ((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd)) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
WHEN F.BlockStart>F.BlockEnd then (((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd))+1440) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
END)
FROM Flight F JOIN RPlane RP
ON F.ID_RPlane = RP.ID_RPlane
where F.ID_RPlane =1 AND FillingDate BETWEEN RP.StartDate AND GETDATE()


Не?
7 июл 14, 18:03    [16271204]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
gandjustas,

Так прибавляется в каждой строке отдельно, а надо чтобы увеличивалось...

вот результат:
48695
48695
NULL
NULL
48635
49525
49525
48635
49183
49164
49525
49183
50073
50073
48719
49182
48642
48674
NULL
NULL
48695
7 июл 14, 18:14    [16271279]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
чтобы понятнее

48634 612 49246
48634 61 48695
48634 61 48695
48634 NULL NULL
48634 NULL NULL
48634 1 48635
48634 891 49525
48634 891 49525
48634 1 48635
48634 549 49183
48634 NULL NULL
48634 NULL NULL
48634 530 49164
48634 61 48695
48634 61 48695
48634 61 48695
48634 891 49525
48634 549 49183
48634 1439 50073
48634 1439 50073

ну и т.д.
7 июл 14, 18:18    [16271313]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ac1-caesar,

Попробую угадать:
select StartTTSN, d, StartTTSN+d 
from (SELECT
RP.StartTTSN,
(CASE 
WHEN F.BlockStart<F.BlockEnd then ((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd)) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
WHEN F.BlockStart>F.BlockEnd then (((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd))+1440) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart))) as d
END)
FROM Flight F JOIN RPlane RP
ON F.ID_RPlane = RP.ID_RPlane
where F.ID_RPlane =1 AND FillingDate BETWEEN RP.StartDate AND GETDATE())
7 июл 14, 18:32    [16271421]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
не увеличивается

Может что не так, но на Ваш вариант ошибку пишет, пришлось немного корректировать. Проверьте плизз.
select StartTTSN, d, StartTTSN+d 
from (SELECT
RP.StartTTSN,
(CASE 
WHEN F.BlockStart<F.BlockEnd then ((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd)) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
WHEN F.BlockStart>F.BlockEnd then (((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd))+1440) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart))) 
END ) as d
FROM Flight F JOIN RPlane RP
ON F.ID_RPlane = RP.ID_RPlane
where F.ID_RPlane =1 AND FillingDate BETWEEN RP.StartDate AND GETDATE()) as d

вот результат

48634 612 49246
48634 NULL NULL
48634 NULL NULL
48634 61 48695
48634 61 48695
48634 1 48635
48634 891 49525
48634 891 49525
48634 1 48635
48634 549 49183
48634 NULL NULL
48634 NULL NULL
48634 530 49164
7 июл 14, 18:46    [16271490]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ac1-caesar,

Что значит "не увеличивается". Какой должен быть результат?
7 июл 14, 18:49    [16271498]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
StartTTSN = 48634, это фиксированное значение. Теперь в запросе каждая строка таблицы с разницей "BlockEnd-BlockStart" должна прибавляться к фиксированному значению, т.е.
48634 61 48695
48634 549 49244
48634 891 50135
48634 530 50665
48634 63 50728
ну и т.д.
7 июл 14, 18:57    [16271525]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
ну или образно:

48634 61 48695
48695 549 49244
49244 891 50135
50135 530 50665
50665 63 50728
7 июл 14, 18:59    [16271537]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ac1-caesar,
Понятно, это называется "нарастающим итогом", а не "увеличивается".

Сходу так не получится сделать, потому что все строки результата независимы, в них нет порядка.
Надо придумать по какому полю упорядочивать.
7 июл 14, 19:02    [16271548]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
ac1-caesar, это прибавка не к фиксированному значению, а к значению предыдущей строки, то есть нарастающий итог. ищите по форуму, таких тем тут миллион
7 июл 14, 19:02    [16271555]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
ac1-caesar
Member

Откуда:
Сообщений: 19
Можно упорядочивать по дате, но в одних сутках может быть много записей. Как тогда быть?
7 июл 14, 19:45    [16271672]     Ответить | Цитировать Сообщить модератору
 Re: прибавление времени к фиксированному значению  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
ac1-caesar,

select RP.StartTTSN,d, RP.StartTTSN+(sum(d) over (order by FillingDate ROWS UNBOUNDED PRECEDING)) as CumulativeTotal
from (SELECT
RP.StartTTSN,
FillingDate, --дата по которой упорядочивать
(CASE 
WHEN F.BlockStart<F.BlockEnd then ((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd)) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
WHEN F.BlockStart>F.BlockEnd then (((DATEPART(hh, F.BlockEnd)*60 + DATEPART(mi, F.BlockEnd))+1440) - (DATEPART(hh, F.BlockStart)*60 + DATEPART(mi, F.BlockStart)))
END) as d
FROM Flight F JOIN RPlane RP
ON F.ID_RPlane = RP.ID_RPlane
where F.ID_RPlane =1 AND FillingDate BETWEEN RP.StartDate AND GETDATE())



2012+
7 июл 14, 21:58    [16272066]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить