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