Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 получил достаточно информации

С приветом Сергей




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.023 c
3-80778           DEJRGU                2002-04-04 14:51  2002.04.25  
Есть ли в TSQL какая-нибудь pause ? (чтобы проверить sp)


6-81010           Hyper-X               2002-01-18 21:22  2002.04.25  
помогите!!!!


14-81079          Helpwuin              2002-03-21 14:14  2002.04.25  
ХЕ ХЕ


14-81042          vopros                2002-03-19 16:43  2002.04.25  
Предлагаю злых нечеловеков исключать отсюда


3-80815           Jony                  2002-04-04 17:20  2002.04.25  
Некорректная работа DBNavigator.