Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

аналог EncodeDate в Interbase или как сцепить строковые значения [D7, IB6.x]


Jiny ©   (2005-01-03 22:22:00) 

Проблема следующая :
определяю диапазон запроса по торговым операциям контрагента,
4 условия (по диапазону дат, по месяцу, по году, за весь период)
Проблем с 1,3 и 4 условиями - нет, проблема со 2-м условием :
когда юзер указывает месяц, к примеру : "Январь" 2005 года,
программа должна подсчитать начальные остатки до "Января" 2005 года, затем отдеьно просчитать январь и вывести результаты.
Пытался сделать условие типа :
поле<"01"+преобразование с cast(month from data_sd)+преобразование с cast(year from data_sd) as timeStamp
выдает ошибку преобразования, даже без cast пробовал :
select '01/'+'01'+'/2004' from tablica тоже выдает ошибку,
даже так пробовал :
select cast('13/' as varchar(3))+cast('01/2004' as varchar(7)) from order_p1
Вот код условия :
TmpDateFilter_OST:=' and (Extract(month from data_sd)<'+IntToSTr(cmbMonth.ItemIndex+1)+' and  Extract(year from data_sd)<='+IntToSTr(sEdtYearM.AsInteger)+')';
TmpDateFilter:=' and (Extract(month from data_sd)='+IntToSTr(cmbMonth.ItemIndex+1)+' and  Extract(year from data_sd)='+IntToSTr(sEdtYearM.AsInteger)+')';
TmpDateTitle:='За '+cmbMonth.Text+' '+inttostr(sEdtYearM.AsInteger)+' г.';


Sandman25   (2005-01-04 12:35:00) [1]

[12] sniknik ©   (04.01.05 12:31)

Да что с ним говорить, если он про индексы никогда не слышал (MIN/MAX у него работу затормозят). Пускай сначала школу закончит.


Sandman25   (2005-01-04 12:34:00) [2]

Меня всегда удивляла позиция мелюзги, которая считает, что в инете есть только дети до 15 лет с соответствующим уровнем знаний. Отсюда и хамство к окружающим, и "стандарт" на использование "ты" при обращении к незнакомым людям. "Грустно, до чего ламерство окрепло" (c) Igorek


sniknik   (2005-01-04 12:31:00) [3]

Jiny   (04.01.05 11:59) [9]
> Дурик ты, msguns ...
пока что впечатление "наоборот".

не хочеш как правильно, ну так мучайся как хочеш, ругатся то зачем? (тем более перекладывая с больной головы на здоровую)
лучше бы прислушался...
обьяснения в [6] не доведены до конца (так и не понятно почему работа с датой как с датой "не уместна, и нецелесообразна"), а то что у тебя индекс не задействуется (если он есть) целесообразно? не будет после ветки с названием "чего это ваш IB такой тормоз?"?


msguns   (2005-01-04 12:02:00) [4]

>Jiny   (04.01.05 11:59) [9]

Ага, так мы крутые ? В смысле хамства. Ну-ну. На сем откланиваюсь


msguns   (2005-01-04 12:01:00) [5]

Кстати, получишь дату, потом получишь новую проблему: времени. Т.к. в IB нет просто даты. Опять будешь сцеплять, только не сей раз минуты с секундами и часами ;))

Не той дорогой идете, товарищи !


Jiny   (2005-01-04 11:59:00) [6]

Дурик ты, msguns, влезаешь во взрослые разговоры, не научившись толком разговаривать, не поняв сути


Jiny   (2005-01-04 11:49:00) [7]

> ...даже без cast пробовал :
> select '01/'+'01'+'/2004' from tablica тоже выдает ошибку,
насколько помню конкатенция строк в IB не + а ||

Извини, вопрос действительно состоял в конкатенции строк
за это спасибо


msguns   (2005-01-04 11:47:00) [8]

>Jiny   (04.01.05 11:41) [6]

Ух, как все запущено-то ! Лечим гланды через ж... ?
А что, нельзя сальдо (т.е. то, что было ДО) получить простым вложенным запросом, причем безо всяких там вычурных MAX и (тем более) MIN, а движняк просуммировать в диапазоне хоть BETTWEEN, хоть просто ">=:sDate and <=:eDate" ?


Jiny   (2005-01-04 11:41:00) [9]

Для всех кто не понял суть проблемы , объясняю :
Представим что мне нужно сделать выборку за 1 месяц 2005 года, вместе с тем, мне нужно просуммировать итоги до 1-го месяца 2005 года, between здесь НЕУМЕСТЕН, т.к. неизвестна начальная дата проведения торговых операций (вычисление даты по MAX и MIN = тоже не уместны, и нецелесообразны), то-есть все что мне нужно это :
1) Выцепить месяц с поля даты
2) Выцепить год с поля даты
3) установить фильтр типа : ДАТА ОПЕРАЦИИ<'01/'+month+'/'+year , само собой с CASTами, только так я смогу определить диапозон до указанного пользователем диапазона.
'01/'+month+'/'+year мне нужно преобразовать в ДАТУ, ну с этим проблем нет, а проблема, что СТОКИ ТО НЕ СЦЕПЛЯЮТСЯ !
SQL выдает ошибку преобразования еще до преобразования в Дату


msguns   (2005-01-04 10:22:00) [10]

ИМХО, трабла высосана из пальца.
Все 4 "зайца" (хотя почему 4-то, интерес может представлять также запросы типа за последнюю неделю/декаду/квартал и т.д.) грохаются простым заданием 2-х переменных "Дата начала периода"/"Дата конца периода", которые можно вводить самыми разными способами (в т.ч. список возможных стандартных периодов)


Deniz   (2005-01-04 06:10:00) [11]

Значит с диапазоном проблем нет, а с месяцем есть?
А слабо месяц представить как диапазон(заодно и индекс будет использоваться)?
т.е. data_sd between :StartDate and :EndDateну или как там для запроса нужно, а уж в Delphi узнать начало и конец месяца не проблема.


Vemer   (2005-01-04 00:51:00) [12]

Похожую проблему с анализом данных решил добавлением 2-х вычисляемых полей с годом и месяцем от даты операции.
Небольшая денормализация, но составление статистических выборок упрощается многократно.


sniknik   (2005-01-03 23:45:00) [13]

чегото недопонимаю, судя по Extract-ам, пытаешся выделить числа из поля типа datatime/timestamp а после из них строчку лепиш и сравниваеш с чем? опять с полем дататайм... ?

бред. работай с датами а не со строками, все станет гораздо проще. и лучше и быстрее... даже по сравнению с UDF.
(пока что ты решаеш не проблему а последствие неправильного подхода)

> ...даже без cast пробовал :
> select '01/'+'01'+'/2004' from tablica тоже выдает ошибку,
насколько помню конкатенция строк в IB не + а ||


Sergey_Masloff   (2005-01-03 22:50:00) [14]

UDF напишется за час и спасет отца русской демократии. Будет значительно быстрее массовых экстрактов.


Наверх

Титульная страница Поиск, карта сайта Написать письмо