Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Синхронное изменение полей типа 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
3-68220
Insider
2003-07-24 01:30
2003.08.21
Синхронное изменение полей типа Date


3-68170
Lenid
2003-07-28 21:22
2003.08.21
Сложный динамический запрос SQL (со значениями всех или 1 edita)


14-68531
Vlad Oshin
2003-08-05 10:56
2003.08.21
Глючит ZIP. iomega IDE на 250 мб


14-68445
TButton
2003-07-08 18:47
2003.08.21
beta Тестирование


3-68149
Magic&Wizard
2003-07-25 14:44
2003.08.21
HELP FireBird 1.5 как его запустить... ни чего не понимаю :)