Запросы, планы, оптимизация запросов, ...
Модераторы: kdv, CyberMax
-
romero1206
- Сообщения: 14
- Зарегистрирован: 12 апр 2006, 15:29
Сообщение
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
Врёш.
Да может и не врет
:
аффтар писал(а):
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:22
В IBExpert база определяет как FireBird1.5
Так же этот запрос я проверяю в C++ Builder'е. Когда его выполняю, такая же ошибка возникает
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 13 апр 2006, 15:30
В IBExpert база определяет как FireBird1.5
IBExpert ничего не "определяет". Если только ты имел в виду меню Services, Server Properties.
А в свойствах алиаса версию БД можно выставить любую, независимо от реалий. Это просто для тебя напоминалка.