![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
аналог 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 напишется за час и спасет отца русской демократии. Будет значительно быстрее массовых экстрактов.