Форум: "Базы";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
ВнизSQL Запрос Найти похожие ветки
← →
vitnt2000 (2002-04-03 06:42) [0]У меня есть база, в которой содержатся поминутные значения параметра за несколько лет:
Время Значение
Подскажите пожалуйста, как построить запрос чтобы получить значение параметра раз в час (в сутки), за определенный промежуток времяни? т.е для значений времяни кратных часу (суткам).
← →
arhelon (2002-04-03 07:59) [1]Какая база ???
попробуй так
Допустим t-datatime a z - значение
select
(z/count(*)) енто среднее
group by to_char(t,"dd/mm/yyyy hh24")
Енто для Оракла прокатит
ежли не оракля то попробуй с cast поизголяться
← →
arhelon (2002-04-03 08:01) [2]Извени с утра тормозю посмотри аналог to_date на MSSQL должен быть.
У мня такая фича прокатила со звонками (и мин, и час и день и месяц) так что пробуй
← →
sniknik (2002-04-03 10:40) [3]Для MSSQL выделить час из даты/времени и сравнивать в запросе
DATEPART ( datepart , date )
datepart возможные значения
year
quarter
month
dayofyear
day
week
weekday
hour
minute
second
millisecond
или .... WHERE CONVERT(char(20), datetime, 14) LIKE "02%"
(за 2-й час) 14 фомат первым час возвращает hh:mi:ss:mmm(24h)
← →
SergSuper (2002-04-03 10:58) [4]в mssql так просто дату не сконвертировать
надо или взять за базу какую-то дату и считать от неё разницу в часах(datediff(hh, base_date, t)) или обрезать строковое представление даты
select substring(convert(varchar(22),t,120),1,13)
ну и среднее надо считать как sum(z)/count(*), а еще лучше как avg(z), это и в Оракле должно быть
← →
sniknik (2002-04-03 11:20) [5]как это так просто не сконвертировать? очень просто, специально проверил для гарантии (а то вдруг память подводит, второй пример мне показался удобнее)
select *,CONVERT(char(20), [date], 14) from cashsail
where CONVERT(char(20), [date], 14) like "00%
работает.
(в этом случае выдает все записи, поле date было датой до переноса из dbf и во времени стоят нули)
так же работает для поля [time] (только тут надо значение часа ставить оно есть, а в дате нули)
← →
SergSuper (2002-04-03 12:43) [6]2 sniknik
Прочитайте повнимательней что я написал.
Функций, которые бы конвертировали бы дату в строку по маске в MSSQL к сожалению нет, поэтому приходиться ковертировать в строку заданного формата, а потом её обрезать. В Оракле это делается проще.
Если написать, как Вы предлагаете, CONVERT(char(20), [date], 14) like "00%, то в выборку не попадут данные у которых есть минуты, в данном случае это не подходит.
← →
sniknik (2002-04-03 13:38) [7]Может я неправильно понял вопрос межет мы говорим про разные вещи но я так понял человеку нужно именно значение часа т.е. с часа до двух или с двух до трех, сквозное не зависимо от дня. а для этого мой пример замечательно подходит.
и туда попадают все данные с минутами (проверял) за указанный час. См. BOL по форматам - 14 - hh:mi:ss:mmm(24h) (возможно этого формата нет в 7 SQL? у вас семерка?иначе зачем вы режете строку)
но в этом случае тоже можно выйти из положения формат 8 108 - hh:mm:ss более ранний должен быть и тоже час первый.
или ваш любимый но не резать а набрать строку для LIKE "____:__:__:02%" например так (по формату), по моему проще чем вырезать.
← →
sniknik (2002-04-03 13:45) [8]P.S. источник возможнго недопонимания - в MSSQL для LIKE символ "_" означает любой символ, а "%" любую строку.
← →
SergSuper (2002-04-03 14:54) [9]Может дело и в недопонимании
declare @t table(t datetime, z float)
insert @t select "20010101 10:00",1 union
select "20010101 10:02",2 union
select "20010101 10:02",3 union
select "20010101 11:00",4
select substring(convert(varchar(22),t,120),1,13), avg(z) from @t
group by substring(convert(varchar(22),t,120),1,13)
Напишите Ваш вариант
← →
sniknik (2002-04-03 15:46) [10]с групировкой тогда так
(изменил ваш пример)
declare @t table(t datetime, z float)
insert @t select "20010101 10:00",1 union
select "20010101 10:02",2 union
select "20010101 10:05",3 union
select "20010101 11:00",4
select DATEPART(hour,t), avg(z) from @t
group by DATEPART(hour,t)
а я имел в виду просто выборку тогда удобнее так (мне кажется)
select * from @t
where CONVERT(char(20), t, 14) like "10%"
(заметь минуты разные а выводятся :O)
← →
SergSuper (2002-04-03 16:53) [11]
select DATEPART(hour,t), avg(z) from @t
group by DATEPART(hour,t)
прэлесно
а если будут данные за другой день?
а я имел в виду просто выборку тогда удобнее так (мне кажется)
select * from @t
where CONVERT(char(20), t, 14) like "10%"
where служит для фильтрации, которая здесь нафиг не нужна, надо же все записи учитывать
(заметь минуты разные а выводятся :O)
Выводятся, но только три записи из четырёх.
В общем прежде чем писать, надо понимать что это будет читать человек, который считает Вас авторитетом и надеется что Вы ему написали что-то вразумительное, а Вы наоборот его только путаете.
Если есть еще вопросы - по почте, я думаю vitnt2000 получил достаточно информации
С приветом Сергей
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c