Перестроение Access'овского запроса

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Перестроение Access'овского запроса

Сообщение romero1206 » 13 апр 2006, 10:52

Раньше использовалась база данных Access. Есть таблица, в ней данные о телефонных переговорах. Нужно получить кол-во звонков в каждый час в течении определенного периода. например :
0 11
1 22
3 4
....
22 123
24 5
Т.е. с нуля до часу было 11 звонков, с часц до двух 22 и т.д.
Для Акцесса запрос строился так:
SELECT Count(*) As Pole1, INT(TimeSeiz*24) As Pole2 FROM Main_Table
WHERE DateSeiz>=38820 AND DateSeiz <=38820
GROUP BY INT(TimeSeiz*24)
TimeSeiz - время занятия, в акцессе хранится как число от 0 до 1
SateSeiz - дата, хранится как целое число целое число
Как этот запрос построить для FireBird?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 13 апр 2006, 13:43

SELECT Count(*) As Pole1, EXTRACT(HOUR FROM TimeSeiz) As Pole2 FROM Main_Table
WHERE DateSeiz>='01.01.2006' AND DateSeiz <='02.01.2006'
GROUP BY EXTRACT(HOUR FROM TimeSeiz)
Это при условии что TimeSeiz имеет тип Time или Timestamp и DateSeiz - Date или Timestamp соответственно.

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 13:53

ругается:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 8.
EXTRACT.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 апр 2006, 13:55

у тебя сервер какой? группировка по выражениям поддерживается по-моему только в FB 1.5.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 апр 2006, 13:56

Аксесс ругаеццо? Или хде? Когда версию сервера научатся писать в вопросах...

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 14:01

В Акцессе пример, который я привел, работет.
Ругается FireBird 1.5

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 апр 2006, 14:08

romero1206 писал(а): Ругается FireBird 1.5
Врёш.

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 14:14

Сам ты врёш.
Ругается на EXTRAC после GROUP BY.
Так же и в IBExperte

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 13 апр 2006, 14:34

Merlin писал(а):
romero1206 писал(а): Ругается FireBird 1.5

Врёш.
Да может и не врет :D :
аффтар писал(а): TimeSeiz - время занятия, в акцессе хранится как число от 0 до 1
SateSeiz - дата, хранится как целое число целое число
Так что аллах его знает из чего он там extrac-ать пытался -
GROUP BY EXTRACT(HOUR FROM TimeSeiz)

Slava Ekimov
Сообщения: 44
Зарегистрирован: 26 окт 2004, 14:30

Сообщение Slava Ekimov » 13 апр 2006, 14:36

romero1206 писал(а):Сам ты врёш.
Ругается на EXTRAC после GROUP BY.
Так же и в IBExperte
Напиши GROUP BY 2

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 14:40

SELECT Count(*) As Pole1, EXTRACT(HOUR FROM TimeSeiz) AS Pole2 FROM Main_Table
WHERE DateSeiz>='01.01.2006' AND DateSeiz <='02.01.2006'
GROUP BY 2;

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, char 8.
2.

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 14:42

Еще раз уточняю - что TimeSeiz - число от 0 до 1 - так было представлено время в Accesse.
Я перекладываю базу с акцесса в FireBird. Здесь DateSeiz - date, TimeSeiz - time

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 14:50

SELECT Count(*) As Pole1, EXTRACT(HOUR FROM TimeSeiz) FROM Main_Table
WHERE DateSeiz>='01.01.2006' AND DateSeiz <='02.05.2006'
GROUP BY TimeSeiz;

Вот так все работает, а группировать по EXTRACt не хочет

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 апр 2006, 15:00

romero1206 писал(а):Сам ты врёш.
Ругается на EXTRAC после GROUP BY.
Так же и в IBExperte
Не-а, не вру. Полуторка чудненько группирует по встроенным функциям. Это единичка не умела и её приходилось обманывать примерно так Group By Abs(Extract(....)) потому что по UDF-кам она уже умела :) Насчёт Эксперта - это наводка на размышления. У него в регистрационной информации базы должно быть явно указано, что сервер FB1.5, а то он начинает умничать и не допускать на сервер запросы, которые полуторка делать умеет. А ещё теоретицки (практицки проверять не начем и лень) может старая gds32.dll упираться, если он есть на клиентском компе и подхватыется невзначай.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 13 апр 2006, 15:02

v6y писал(а): Так что аллах его знает из чего он там extrac-ать пытался -
GROUP BY EXTRACT(HOUR FROM TimeSeiz)
Это да. Но тогда ошибка другая бы была.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 13 апр 2006, 15:11

сдается мне, что сервер у него все же не 1.5

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 15:14

Firebird SQL Server
1.5.2.4731

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 15:22

В IBExpert база определяет как FireBird1.5
Так же этот запрос я проверяю в C++ Builder'е. Когда его выполняю, такая же ошибка возникает

romero1206
Сообщения: 14
Зарегистрирован: 12 апр 2006, 15:29

Сообщение romero1206 » 13 апр 2006, 15:28

Сорри!!!!
Это я тормоз. Спасибо! Все работает

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 апр 2006, 15:30

В IBExpert база определяет как FireBird1.5
IBExpert ничего не "определяет". Если только ты имел в виду меню Services, Server Properties.
А в свойствах алиаса версию БД можно выставить любую, независимо от реалий. Это просто для тебя напоминалка.

Ответить