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

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

Синхронное изменение полей типа Date


Insider ©   (2003-07-24 01:30:00) 

Есть таблица, в которой нужно ижменить некотороеколичество полей типа Date на некоторое количество временных единиц.
Как это можно сделать, не прибегая к чтению набора полей, его изменению и последующей записи ?
Т.Е. нечто вроде:


UPDATE TABLE1
SET
"DATEFIELD1"="DATEFIELD1"+2,
"DATEFIELD2"="DATEFIELD2"+3,
"DATEFIELD3"="DATEFIELD3"+2
WHERE
"PARAM"="param_value";


?


Zacho   (2003-07-28 08:37:00) [1]


> Insider © (27.07.03 17:12)
> Не понял?
> Можно сэмпл?

Сэмпл чего ? На Yaffil отлично работает именно такой запрос, как ты и приводил.

> И что за Yaffil?

Один из клонов IB (а еще есть FireBird), гораздо более продвинутый по сравнению с IB6.x Подробнее см. http://yaffil.ibase.ru

> У меня тут такая мысля пришла в голову: а что если CAST(CAST(CAST(DATEFIELD1)
> AS VARCHAR) AS FLOAT + 2) AS DATE?

Так не выйдет, посмотри что вернет CAST (DATEFIELD AS VARCHAR(10)), во FLOAT это потом не преобразуется.
Но можно воспользоваться функцией EXTRACT, и сделать это в хранимой процедуре (а может, получиться и прямо в запросе), примерно так (это только для иллюстрации идей, довести до работоспособного состояния самому :) ):
DECLARE VARIABLE ADAY INTEGER;
DECLARE VARIABLE AMONTH INTEGER;
DECLARE VARIABLE AYEAR INTEGER;
begin
FOR SELECT DATEFIELD FROM ... INTO :DATEFIELD DO
BEGIN
ADAY=EXTRACT (MONTH FROM DATEFIELD);
AMONTH=EXTRACT (MONTH FROM DATEFIELD);
AYEAR=EXTRACT (YEAR FROM DATEFIELD);
ADAY=ADAY+2;
( CAST(ADAY AS CHAR(2)


> Insider © (27.07.03 17:12)
> Не понял?
> Можно сэмпл?

Сэмпл чего ? На Yaffil отлично работает именно такой запрос, как ты и приводил.

> И что за Yaffil?

Один из клонов IB (а еще есть FireBird), гораздо более продвинутый по сравнению с IB6.x Подробнее см. http://yaffil.ibase.ru

> У меня тут такая мысля пришла в голову: а что если CAST(CAST(CAST(DATEFIELD1)
> AS VARCHAR) AS FLOAT + 2) AS DATE?

Так не выйдет, посмотри что вернет CAST (DATEFIELD AS VARCHAR(10)), во FLOAT это потом не преобразуется.
Но можно воспользоваться функцией EXTRACT, и сделать это в хранимой процедуре (а может, получиться и прямо в запросе), примерно так (это только для иллюстрации идей, довести до работоспособного состояния самому :) ):
DECLARE VARIABLE ADAY INTEGER;
DECLARE VARIABLE AMONTH INTEGER;
DECLARE VARIABLE AYEAR INTEGER;
begin
FOR SELECT DATEFIELD FROM ... INTO :DATEFIELD DO
BEGIN
ADAY=EXTRACT (MONTH FROM DATEFIELD);
AMONTH=EXTRACT (MONTH FROM DATEFIELD);
AYEAR=EXTRACT (YEAR FROM DATEFIELD);
ADAY=ADAY+2;
DATEFIELD=CAST(CAST(ADAY AS CHAR(2))||"."||CAST(AMONTH AS CHAR(2))||"."CAST(AYEAR AS CHAR(4)) AS DATE)
UPDATE ... SET DATEFIELD=:DATEFIELD WHERE ..
END
END


Insider   (2003-07-27 17:12:00) [2]

Не понял?
Можно сэмпл?
И что за Yaffil?
У меня тут такая мысля пришла в голову: а что если CAST(CAST(CAST(DATEFIELD1) AS VARCHAR) AS FLOAT + 2) AS DATE ?


Zacho   (2003-07-25 09:59:00) [3]

Ну не знаю, у меня - работает. Правда, у меня Yaffil, а в нем поддерживается взаимообратное преобразование типов DATE, TIME и TIMESTAMP в INTEGER и DOUBLE. Насколько помню, в IB 6.x DATE можно преобразовать только к CHAR, VARCHAR и TIMESTAMP. Так что, imho, используй UDF.


Insider   (2003-07-24 23:43:00) [4]

Проблема в том, что это не канает!!!
Выдает: Unknown token 2


ЮЮ   (2003-07-24 02:42:00) [5]

Твое "нечто вроде" вполне соответствует синтаксису UPDATE, в чем проблема?


Наверх

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