powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
19 сообщений из 19, страница 1 из 1
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33879303
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею процедуру
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create procedure test (  IN W_DATE  timestamp )
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN 

end;


В Delphi есть контрол для ввода даты-времени с параметром DateTime, Естественно( для Delphi) , он выглядит например так
Код: plaintext
1.
:B_DATE =  01 . 07 . 2005   0 : 00 : 01 
Необходимо обратиться к процедуре
Код: plaintext
1.
Call test(:B_DATE)

Если так и обращаюсь, то получаю
Код: plaintext
1.
[IBM][CLI Driver][DB2/NT] SQL0180N  Неверный синтаксис строчного представления даты и времени.  SQLSTATE= 22007 

Пытаюсь на лету переформатироваться в приемлимый вид с помощью функции типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE function f_DTinTS ( sdt varchar( 32 ) )
returns TIMESTAMP
begin atomic  
   DECLARE TS TIMESTAMP; 
   DECLARE w_dt varchar( 32 );
   DECLARE p1 integer; 
   DECLARE p2 integer; 
   
   SET p1 = locate('.',sdt); if p1> 0  then  set p2 = locate('.',substr(sdt,p1+ 1 ,length(sdt)-p1)); end if;
   if (p1> 0 ) and (p2> 0 ) and (p2< 4 ) then 
      set w_dt =trim(substr(sdt,p1+p2+ 1 , 4 )||'-'||substr(sdt,p1+ 1 ,p2- 1 )||'-'||substr(sdt, 1 ,p1- 1 )||substr(sdt,p1+p2+ 5 ,length(sdt)-(p1+p2+ 5 - 1 )));
      if length(w_dt)< 12  then 
         set w_dt=w_dt||' 00:00:00'; 
      end if;                  
   end if;
   SET TS=TimeStamp(w_dt);
   return TS;
end

и обращаясь следующим образом

Код: plaintext
1.
Call test(f_DTinTS(:B_DATE) )


но налетаю на запрет

Код: plaintext
1.
[IBM][CLI Driver][DB2/NT] SQL0418N  Оператор содержит неверное использование маркера параметра.  SQLSTATE= 42610 
{SQLExecDirect} 

Можно ли, как то синтаксически решить этот вопрос ничего кардинально не меняя в Delphi?
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33879434
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В качестве фактических параметров в процедуры нельзя передавать выражения.
Используйте в delphi для присваивания значения переменную типа DateTime, а при вызове процедуры ее в качестве фактического значения.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33879652
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То, что нельзя я понял. Но в Delphi я и так использую DateTime.

Код: plaintext
1.
XXX.ParamByName('B_DATE').AsDateTime :=( trunc(BegDate.Date)+frac(BegTime.Time) );

Поэтому в рекомендации ничего не понял. Если только, Вы советуете отказаться вообще от маркера в сторону фактического параметра. Но я не могу так написать.
Код: plaintext
1.
2.
3.
 DECLARE DT Datetime;
 set DT=f_DTinTS(:B_DATE);
 call test(DT);

Это уже XП. У меня же не ХП и операторы SQL выполняются по одному .
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33879824
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно подать на вход такой процедуре строку в формате
'yyyy-MM-dd hh.mm.ss'
т.е.
Код: plaintext
call test('2005-07-01 00:00:00')
заведите у себя в delphi строковую переменную и вызывайте ХП с ней.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33879906
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот ход понятен, но для моего случая очень трудоемок. Вообще то, подобные задачи для всех других платформ обычно решают драйвера. Но у DB2 с европейским форматом TimeStamp видимо туго. Неужели нет хода попрямее?
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880194
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
внутрях вашей SP используйте
http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0007107.htm
для получения timestamp из вашей строки.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880367
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никогда бы не подумал, что
Код: plaintext
1.
select  TIMESTAMP_FORMAT('1999-12-31 3:59:59','YYYY-MM-DD HH24:MI:SS') from sysibm.sysdummy1

вернет европейский формат( т.е. как я понял то, что задано в настройках Win ).

Но это не решает вопроса, т.к. на вход процедуры идет не строка а DateTime.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880406
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если работаешь через ADO, то попробуй напрмер так:
Код: plaintext
1.
2.
3.
4.
 with  ADOCommand1.Parameters.ParamByName('B_DATE')  do 
   begin 
    DataType:= ftString;
    Value:= '2006-07-26-17.13.36'
   end 
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880408
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но какая-то недоделанная функция, Даже
Код: plaintext
1.
select  TIMESTAMP_FORMAT('12-10-1999 3:59:59','DD-MM-YYYY HH24:MI:SS') from sysibm.sysdummy1

не может понять. А поворачивает в Европу видимо Win, a не DB2.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880422
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Если работаешь через ADO, то попробуй напрмер так:

with ADOCommand1.Parameters.ParamByName('B_DATE') do
  begin
    DataType:= ftString;
    Value:= '2006-07-26-17.13.36'
  end

Так, видимо, и придется портить код Delphi. Но это должно сработать не только под АДО, но и у меня в БДЕ.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880442
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В BDE у меня как раз проблем с TIMESTAMP нет. Параметру тип ftDateTime и вперёд.
А, вот, с ADO получается только так.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880516
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
функция очень даже доделанная.
Просо смотрите, что она берет на входе, и что возвращает.
На входе у нее произвольная строка с указанием формата строки, а на выходе значение TIMESTAMP.
Само собой, что на входе строка
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33880549
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
В BDE у меня как раз проблем с TIMESTAMP нет. Параметру тип ftDateTime и вперёд.

И у меня маркер ftDateTime. Однако

Код: plaintext
1.
Call test(:B_DATE)

происходит облом.
Код: plaintext
1.
2.
[IBM][CLI Driver][DB2/NT] SQL0180N  Неверный синтаксис строчного представления даты и времени.  SQLSTATE= 22007 

.

Код: plaintext
1.
2.
3.
4.
функция очень даже доделанная.
Просо смотрите, что она берет на входе, и что возвращает.
На входе у нее произвольная строка с указанием формата строки, а на выходе значение TIMESTAMP.


Так как мне из строки

Код: plaintext
1.
:B_DATE =  01 . 07 . 2005   0 : 00 : 01 
получить с помощью TIMESTAMP_FORMAT TIMESTAMP проше, чем скрутить самокрутку с помощью Substr?
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33881231
ggv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ggv
Гость
так кто ж знает, что вам проще.
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33882739
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C помощью TIMESTAMP_FORMAT у меня не получается вообще. Может подскажете как?
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33884424
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValPotТак, видимо, и придется портить код Delphi
Почему "портить". Есть хорошая функция FormatDateTime.
Заведи для удобства константу
Код: plaintext
1.
 const 
  DB2_FORMAT_TIMESTAMP = 'yyyy-mm-dd-hh.nn.ss.zzz';
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33908890
ПсоП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алекс дело говорит, простой и прямой способ.
А у ВАс похоже, ошибка в коде переформатирования
set w_dt=w_dt||' 00:00:00' - не пробел, а тире, и дальше разделители - точки
...
Рейтинг: 0 / 0
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #33909190
ValPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за участие, к вопросу смогу вернуться в сентябре.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
    #35953037
Фотография Vad72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот из Дельфи пример запроса. Тут data1, data2 - переменные в дельфи типа дататайм.

SELECT
INFO_TU.ID_REC*-1 as IDTU,
sum(coalesce(EXP.EXPENSE_SUM,0)) as KVT
FROM INFO_TU
left join
( SELECT NMB_TU, ID_CLIENT, EXPENSE_SUM
FROM INFO_HEXPENSE
WHERE days(date(R_YEAR||'-'||R_MONTH||'-01')) >= days(date(cast(:data1 as char(10))))
AND
days(date(R_YEAR||'-'||R_MONTH||'-01')) < days(date(cast(:data2 as char(10))))
AND SEL_BILL=1
AND (info_hexpense.sel_taccount <> 1 OR info_hexpense.sel_taccount is NULL)
AND info_hexpense.sum_cost >= 0
)
EXP ON EXP.NMB_TU=INFO_TU.NMB_TU AND EXP.ID_CLIENT=INFO_TU.ID_CLIENT
WHERE info_tu.type_tu=1 and (INFO_TU.ID_REC*-1 = :IDTU)
group by INFO_TU.ID_REC
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DateTime(delphi)+Маркер+TimeStamp(DB2) в ХП
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]