Форум: "Базы";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
ВнизСинхронное изменение полей типа Date Найти похожие ветки
← →
Insider (2003-07-24 01:30) [0]Есть таблица, в которой нужно ижменить некоторое количество полей типа Date на некоторое количество временных единиц.
Как это можно сделать, не прибегая к чтению набора полей, его изменению и последующей записи ?
Т.Е. нечто вроде:
UPDATE TABLE1
SET
"DATEFIELD1"="DATEFIELD1"+2,
"DATEFIELD2"="DATEFIELD2"+3,
"DATEFIELD3"="DATEFIELD3"+2
WHERE
"PARAM"="param_value";
?
← →
ЮЮ (2003-07-24 02:42) [1]Твое "нечто вроде" вполне соответствует синтаксису UPDATE, в чем проблема?
← →
Insider (2003-07-24 23:43) [2]Проблема в том, что это не канает!!!
Выдает: Unknown token 2
← →
Zacho (2003-07-25 09:59) [3]Ну не знаю, у меня - работает. Правда, у меня Yaffil, а в нем поддерживается взаимообратное преобразование типов DATE, TIME и TIMESTAMP в INTEGER и DOUBLE. Насколько помню, в IB 6.x DATE можно преобразовать только к CHAR, VARCHAR и TIMESTAMP. Так что, imho, используй UDF.
← →
Insider (2003-07-27 17:12) [4]Не понял?
Можно сэмпл?
И что за Yaffil?
У меня тут такая мысля пришла в голову: а что еслиCAST(CAST(CAST(DATEFIELD1) AS VARCHAR) AS FLOAT + 2) AS DATE
?
← →
Zacho (2003-07-28 08:37) [5]
> 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
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.08.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c