![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос MSSQL про наработанное время в поле DATETIME [D5, MSSQL]
Павел © (2004-10-05 09:14:00)Уважаемые, Мастера !
Помогите составить сложнейший запрос.
Есть таблица MSSQL
logtime tagname tagvalue
2004-08-20 08:42:29.000 Y4_41 1
2004-08-20 08:43:29.000 Y5_41 1
2004-08-20 08:48:47.000 Y4_41 0
2004-08-20 09:11:12.000 Y4_41 1
2004-08-20 09:13:31.000 Y4_41 0
Как подсчитать наработанное время, в данном примере таблицы, так, чтобы по полю TAGNAME по значению Y4_41 выбрало TAGVALUE 1
т.е. грубо говоря посчитало так
tagname tagvalue
1 строка стоит у нас Y4_41 и 1
3 строка стоит у нас Y4_41 и 0
время получится 6 мин 18 сек.
и т.д.
вот как мне посчитать это наработанное время согласно такому вот (мне кажется непонятно как я обьяснил) условию...
Получается в итоге:
Y4_41 0 = 6.18+1.19 = 7 мин 37 сек
Skyle (2004-10-05 10:06:00) [21]> [4] Fay © (05.10.04 10:04)
Почему?
Fay (2004-10-05 10:04:00) [22]>> Возможно для повышения точности подойдёт что-то типа timeStamp...
Не, это не прокатит. Как и BLOB 8)
Skyle (2004-10-05 09:54:00) [23]telepathy.Enabled := true;
Есть мнение, что TagValue - состояние какого-то измерения. 0 - выключено (что-то), 1 - включено, TagName - это идентификатор этого самого нечто.
Возможно хочется найти время, в течение которого работало нечто с идентификатором таким-то.
Моделирую.
CREATE TABLE #T (Value datetime, AName varchar(10), AId INT)
INSERT #T VALUES('2004-08-20 08:42:29.000', 'Y4_41', 1)
INSERT #T VALUES('2004-08-20 08:43:29.000', 'Y5_41', 1)
INSERT #T VALUES('2004-08-20 08:48:47.000', 'Y4_41', 0)
INSERT #T VALUES('2004-08-20 09:11:12.000', 'Y4_41', 1)
INSERT #T VALUES('2004-08-20 09:13:31.000', 'Y4_41', 0)
SELECT Tag, CAST(Sum(Val) AS datetime)
FROM (SELECT CASE WHEN AId = 0 THEN CAST(Value AS float)
ELSE CAST(Value AS float) * -1
END AS Val, AName AS Tag
FROM #T
WHERE AName = 'Y4_41') T --Такой Where потому что Y5_41 не выключен и будет минус
GROUP BY Tag
DROP TABLE #T
Всё, что выше 1900.01.01 00:00:00.0000 и будет искомое время.
Точность, конечно, не ахти какая, но тут главное понять, правильно я вопрос понял или нет....
Возможно для повышения точности подойдёт что-то типа timeStamp...
ЮЮ (2004-10-05 09:33:00) [24]Как понимаешь, только "на пальцах" иожно объяснить, ято первой строке должна соответствовать 3-я, а не 5-я, которая, в принципе, только временем отличается, поэтому для связи на уровне сервера - данных мало (связывать по времени, которое можно найти из агрегирующего подзапроса, выполняемого для каждой записи таблицы - занятие неблагодарное даже для MS SQL)
Fay (2004-10-05 09:20:00) [25]Бред какой-то. Структуру данных с описанием и русифицированный текст задачи, будьте любезны.