Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Попробуйте пересоздать функцию. А ещё лучше - дропнуть и создать заново.
Кстати, сервер БД какой? (MS, IB, Oracle, ...)

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 09:37 08-09-2017
akaBadSanta



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
можно попробовать динамическим sql
меня периодически такой подход спасает

Код:
 
function TimeX return number is  
TimeX number(10,8);
stmt varchar2(4000);
begin  
    stmt := 'select to_number(sStr)  
                     from Params  
                     where sName = ''Time1''';  
    execute immediate stmt into TimeX;
  return TimeX;  
    exception when others then  
  return 30;  
end TimeX;  

Всего записей: 11 | Зарегистр. 08-09-2011 | Отправлено: 12:25 08-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dronton2

Цитата:
Попробуйте пересоздать функцию. А ещё лучше - дропнуть и создать заново.
Кстати, сервер БД какой? (MS, IB, Oracle, ...)

БД Oracle 11.2.0.2.
Я то дропнуть могу, только потом меня тоже дропнут )))

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:21 11-09-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
P.S. Благодарствую за советы! Кажется разобрался. Клин ловится несколько раньше в процедуре судя по всему. Но почему возвращается значение по исключению из этой функции - вопрос остается.

 
Как-то все вырвано из контекста. Что за процедура? Как вызывается из клиента? Как коннектишься к базе из клиента?

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 14:09 11-09-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Как же вы тут намутили, пипец полный! Не зная даже как просто дропнуть и затем создать.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 21:28 11-09-2017 | Исправлено: Alexzzy, 21:39 11-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Как-то все вырвано из контекста. Что за процедура? Как вызывается из клиента? Как коннектишься к базе из клиента?

Клиентское приложение инициирует операцию закрытия договора. Параметры подключения живут в конфигах клиентского приложения.
С точки зрения конечного клиента - он просто заполняет поля и нажимает кнопку "сохранить". По нажатию кнопки срабатывает каскад процедур, которые ставят на выполнение некое количество задач. У каждой задачи свое время срабатывания, у некоторых жестко указано 23:00 (например), а для некоторых время срабатывания высчитывается динамически. Как-то так.
В итоге расследования выяснилось, что глюк ловился не функцией, возвращающей временной интервал, а возникал из-за таймаута обращения во внешнюю систему.
 

Цитата:
Как же вы тут намутили, пипец полный! Не зная даже как просто дропнуть и затем создать.

Художника обидеть может каждый
Знать, как дропнуть и создать процедуру это одно, но фиг ты это сделаешь, когда прав на это нет

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 16:40 12-09-2017 | Исправлено: NiXXX, 16:42 12-09-2017
LoneWolfII



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прошу помощи с SQL запросом:
 
Есть три таблицы.
 
Таблица № 1  
 
NAME  PARAM  OTHER
n1         p1         o1
n2         p2         o2
 
Таблица № 2
NAME  
n1  
n2
 
Таблица № 3
NAME  DATETIME
n1         dt1
n2         dt1
 
 Как вывести значения из всех трех таблиц, чтобы значения  по столбцам были следующие:
 
|  Таблица2.n1 |  Таблица1.n1 | Таблица1.p1 | Таблица3.dt1 |
 
, где n1 - одинаковый параметр во всех трех таблицах.  Условия объединения всех трех таблиц -  параметр Таблица1.o1. Если он например "True", то данные формируются. Иначе - нет.  Параметр - Таблица3.dt1 должен быть последний по дате.  
 

Всего записей: 541 | Зарегистр. 03-10-2001 | Отправлено: 20:30 14-09-2017 | Исправлено: LoneWolfII, 21:05 14-09-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LoneWolfII
Связываете всё по NAME и отфильтровываете нужное по Таблица1.o1 (мысли, подключая телепатические способности)
С датой сами разбирайтесь из-за "всеобъемлюще-бредоватого" описания. Если нужна максимальная дата для каждого NAME то отфильтровывайте подзапросом (связав по NAME) сравнивая с max(datetime).

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 21:56 14-09-2017 | Исправлено: Alexzzy, 22:25 14-09-2017
Dronton2

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
из-за "всеобъемлюще-бредоватого" описания
Также, из описания непонятно тип соединения таблиц (нужно делать IN JOIN или OUTER JOIN) и уникальность поля NAME в таблицах (например, во всех таблицах значения поля NAME неуникальны)

Всего записей: 460 | Зарегистр. 27-06-2005 | Отправлено: 10:31 15-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжаю свою прогулку по граблям.
Помимо Oracle в хозяйство добавили Sybase...
Хочу просто посчитать количество записей по дням за промежуток из таблицы в Sybase. Делаю:
select count(*), convert(date,d.Date_Dog,104) Date_Dog from dogovors d where d.Date_Dog between convert(date,'01.01.2017',104) and convert(date,'31.03.2017',104)
group by Date_Dog
Возвращает таблицу, в которой "кол-во записей | дата", но даты почему-то дублируются. Такое ощущение, что прихватываются часы...
Пробую вместо convert(date,d.Date_Dog,104) выполнить cast(d.Date_Dog as date) - идет второй час выполнения запроса
 
Как правильно сгруппировать в этом Sybase только по дате, без учета часов?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 13:00 15-09-2017 | Исправлено: NiXXX, 14:34 15-09-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Sybase то какой, для начала? Их там несколько разных. ASE? И какой версии?

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 16:06 15-09-2017 | Исправлено: Alexzzy, 16:08 15-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Sybase то какой, для начала? Их там несколько разных. ASE? И какой версии?

Adaptive Server Enterprise/15.7/EBF 26396 SMP SP138 /P/RS6000/AIX 6.1/ase157sp138x/4002/64-bit/FBO/Mon Aug 29 07:52:07 2016

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 17:08 15-09-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Быстрым взглядом примерно так.
 
Код для ASE 15.7 для получения текущей даты без времени (работает в продакшне на ASE 15.7).
select convert(datetime, convert(varchar, getdate(), 102))
 
Вместо прямого использования "between '20170101' and '20170331'" можно и избыточный convert использовать, на любителя.
 
select count(*) cnt, convert(datetime, convert(varchar, d.Date_Dog, 102)) Date_Dog  
from dogovors d  
where d.Date_Dog between '20170101' and '20170331'  
group by convert(datetime, convert(varchar, d.Date_Dog, 102))
 
Не сработает пишите, разберемся.
 
P.S.
У ASE своеобразная группировка, выходящая за стандарт. Поддерживая стандарт, выходит на интересные (нестандартные) варианты типа count(count(*))...
В данном случае, взглянув, версия ASE не важна - это базовый функционал из древних времен.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 18:11 15-09-2017 | Исправлено: Alexzzy, 02:55 16-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
Благодарствую. Поставлю запрос на ночь, а то предыдущие выполнялись по два с лишним часа.
Sybase мне нереально доставляет своими двойными и тройными convert'ами...

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 14:14 18-09-2017
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NiXXX
Можно без конвертов и сделать функцию.

Код:
 
create function dbo.f_TruncateTime  
    @dt datetime  
 
    returns datetime  
as  
begin  
    /* убирает время из даты */  
     
    return dateadd(day, datediff(day, '20000101', @dt), '20000101')  
end
 

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 18:51 18-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alexzzy
Еще раз благодарствую - запрос отработал как надо.
Выполнялся он 3,5 часа на двухмесячном интервале (в среднем по 30к записей в день). На больших интервалах тестить не стал

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 12:34 20-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть у меня табличка (БД Oracle), в одном поле которой лежит xml-файл. У этого файла есть два интересующих меня раздела Date_from и Date_to. Можно как-то средствами оракл (или просто селектом) найти все записи, у которых Date_from != Date_to?

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 10:55 29-09-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Есть у меня табличка (БД Oracle), в одном поле которой лежит xml-файл. У этого файла есть два интересующих меня раздела Date_from и Date_to. Можно как-то средствами оракл (или просто селектом) найти все записи, у которых Date_from != Date_to?

 
Можно. Типа такого:

Код:
select t.*, Date_from, Date_to
  from table1 t,
          XMLTABLE('$p/тут путь в XML к атрибутам Date_from и Date_to/*'
          passing XMLTYPE(t.xml_field) as "p"  
          COLUMNS
            Date_from date path '*/@Date_from',
            Date_to date path '*/@Date_to)
 

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 12:20 29-09-2017 | Исправлено: Mic777, 12:21 29-09-2017
NiXXX



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mic777
Что-то я делаю не так...
Какого вида должен быть указан путь в  XMLTABLE('$p/...'? Через / и запятая между путями к разным датам?
Проблема еще в том, что путь /DX/SvcRq/UID/OrigDt/Day содержит UID записи - его надо передавать...

Всего записей: 365 | Зарегистр. 06-05-2003 | Отправлено: 11:27 02-10-2017 | Исправлено: NiXXX, 11:37 02-10-2017
Mic777

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Что-то я делаю не так...

Лучше пример XML
 
 XMLTABLE('$p/... - здесь общий путь типа /Rq/SvcRq/Info
а делить можно уже в колонках COLUMNS  
 
Date_from date path 'OrigDt/@Day',
Date_to date path 'DueDt/@Day)

Всего записей: 90 | Зарегистр. 15-12-2005 | Отправлено: 12:43 02-10-2017 | Исправлено: Mic777, 12:47 02-10-2017
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru