Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом выборки промежутка времени за месяц / 13 сообщений из 13, страница 1 из 1
02.10.2008, 12:48
    #35571908
Maxim Timofeyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Добрый день!

Есть таблица содержащая CDR (детализацию звонков).
С плями длительности и времени звонка (и прочими).
Нужно сделать выборку из таблицы за месяц, но в заданный промежуток времени.
Т.е. Все записи в течение месяца за время с 10:00 до 22:00 (к примеру).
Осень не хочется делать цикл. Можно ли сделать это одним запросом?

Заранее спасибо!
...
Рейтинг: 0 / 0
02.10.2008, 13:03
    #35571985
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
воспользуйтесь функцией date_part: дока
...
Рейтинг: 0 / 0
02.10.2008, 14:08
    #35572329
Maxim Timofeyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
LeXa NalBatвоспользуйтесь функцией date_part: дока
За ссылку спасибо, но никак не сооброжу чем мне поможет данная функция сделать 1 запрос.
Я могу сделать функцию и там цикл, но хочется сделать это красивее, т.к. цикл будет сильно тормозить БД.
Может есть какой-нибудь пример?

Заранее спасибо!
...
Рейтинг: 0 / 0
02.10.2008, 14:33
    #35572433
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Maxim Timofeyev LeXa NalBatвоспользуйтесь функцией date_part: дока
За ссылку спасибо, но никак не сооброжу чем мне поможет данная функция сделать 1 запрос.
Я могу сделать функцию и там цикл, но хочется сделать это красивее, т.к. цикл будет сильно тормозить БД.
Может есть какой-нибудь пример?

Заранее спасибо!
Код: plaintext
1.
2.
3.
4.
SELECT * 
FROM my_fun_table 
WHERE 
(date_part('hour', call_time_begin)> 10 ) and (date_part('hour', call_time_begin)< 12 ) and (date_part('month', call_time_begin) in ( 9 , 10 )); 
...
Рейтинг: 0 / 0
03.10.2008, 00:29
    #35573640
Konstantin~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
если у вас естъ индек по полю времени звонка, надо провeрьте/убедитесь что date_part() его использует, а нето будет скан по всей таблице. (если индекса нет то фиолетово)
...
Рейтинг: 0 / 0
03.10.2008, 10:06
    #35573968
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Konstantin~если у вас естъ индек по полю времени звонка, надо провeрьте/убедитесь что date_part() его используетпостгрес не сможет для проверки ограничения date_part() использовать индекс по timestamp.
для ускорения надо строить функциональный индекс по ( date_part( 'hour', call_time_begin ) ).
...
Рейтинг: 0 / 0
03.10.2008, 12:39
    #35574527
Maxim Timofeyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
LeXa NalBatпостгрес не сможет для проверки ограничения date_part() использовать индекс по timestamp.
для ускорения надо строить функциональный индекс по ( date_part( 'hour', call_time_begin ) ).

Так?
CREATE INDEX calldate_date_part_idx ON callslog (calldate) WHERE date_part('hour'::text, calldate);
ERROR: тип аргумента конструкции WHERE должен быть boolean, а не double precision
Но так не получается.
...
Рейтинг: 0 / 0
03.10.2008, 12:40
    #35574529
Konstantin~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
если использовать только date_part() то да.

можно используя индекс выбрать данные по месяцу, а из их потом выбрать данные по конкретным часам. Или использовать <timestamp_filed>::time

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT ... FROM 
     --- суб запрос будет использовать индекс
    (SELECT  FROM ...  WHERE  cdr_timestamp >= '2008-01-01'::date  
                                        AND cdr_timestamp < '2008-01-02'::date)
   WHERE date_part('hour', cdr_timestamp )...   -- тут часть запроса которая выбирает данные
                                                                   -- для конкр. времени по часам


или можно еще проще

Код: plaintext
1.
2.
3.
4.
5.
  -- такой запрос будет использовать индекс
 SELECT ...  FROM ...  WHERE  cdr_timestamp >= '2008-01-01'::date  
                                        AND cdr_timestamp < '2008-01-02'::date
                                        AND (cdr_timestamp::time >= '08:00:00'::time 
                                                 AND  cdr_timestamp::time < '22:00:00'::time );
...
Рейтинг: 0 / 0
03.10.2008, 12:45
    #35574552
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Maxim TimofeyevТак?
CREATE INDEX calldate_date_part_idx ON callslog (calldate) WHERE date_part('hour'::text, calldate);
ERROR: тип аргумента конструкции WHERE должен быть boolean, а не double precision
Но так не получается.нет. CREATE INDEX calldate_date_part_idx ON callslog ( date_part('hour'::text, calldate) );
...
Рейтинг: 0 / 0
03.10.2008, 12:46
    #35574557
Maxim Timofeyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Andrey Daeron
Код: plaintext
1.
2.
3.
4.
SELECT * 
FROM my_fun_table 
WHERE 
(date_part('hour', call_time_begin)> 10 ) and (date_part('hour', call_time_begin)< 12 ) and (date_part('month', call_time_begin) in ( 9 , 10 )); 


Огромное спасибо -- работает! осталось разобраться с индексами.
...
Рейтинг: 0 / 0
03.10.2008, 12:47
    #35574563
Konstantin~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
второй запрос был слегка неверный, и в первом помойму надо добавить AS something для суб-селекта
Код: plaintext
1.
2.
3.
4.
5.
-- такой запрос будет использовать индекс
 SELECT ...  FROM ...  WHERE  cdr_timestamp >= '2008-01-01'::date  
                                        AND cdr_timestamp < '2008-02-01'::date  -- месяц был неверный
                                        AND (cdr_timestamp::time >= '08:00:00'::time 
                                                 AND  cdr_timestamp::time < '22:00:00'::time );
...
Рейтинг: 0 / 0
03.10.2008, 13:35
    #35574746
Maxim Timofeyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
LeXa NalBatнет. CREATE INDEX calldate_date_part_idx ON callslog ( date_part('hour'::text, calldate) );

Так тоже не получается:
Код: plaintext
1.
CREATE INDEX updatedate_date_part_idx ON callslog ( date_part('hour'::text, updatedate) );
ERROR:  фунции в идексном выражении должны быть помечены как IMMUTABLE
...
Рейтинг: 0 / 0
03.10.2008, 14:07
    #35574861
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом выборки промежутка времени за месяц
Maxim TimofeyevТак тоже не получается:

ERROR: фунции в идексном выражении должны быть помечены как IMMUTABLEпереходите на новую версию постгреса.

или создавайте свою функцию-обертку с флагом immutable.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите с запросом выборки промежутка времени за месяц / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]