Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-80920
Fredericco
2002-04-11 10:36
2002.04.25
Вопрос, наверно, по основам. Создаю приложение без формы...


1-80917
hm
2002-04-11 12:35
2002.04.25
RichEdit


4-81120
Mover
2002-02-19 10:58
2002.04.25
Работа с Desktop


1-80976
Shadow77
2002-04-09 18:43
2002.04.25
Приложение не должно быть видно в панели задач.


14-81058
Somebody_
2002-03-20 11:31
2002.04.25
новый трейд ПРО ЭТО.....