powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Работа с датами
2 сообщений из 2, страница 1 из 1
Работа с датами
    #32140003
Фотография KiLLun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Работаю с IB 6.0
Вот какая проблема. Есть два поля (тип Date)
Нужно в зависимости от первого поля, второе увеличивать на 5 лет.
(если например значение первого поля 01.01.2002, то второе автоматом 01.01.2007). На прежней базе(Dialect 1) у меня проходила такая процедура
CREATE PROCEDURE YEAR1(
ADATE DATE)
RETURNS (
RESULT INTEGER)
AS
DECLARE VARIABLE ElapsedDays INTEGER;
DECLARE VARIABLE ElapsedYears INTEGER;
BEGIN
WHILE(CAST(ADate AS VARCHAR(5)) <> "1-JAN") DO
ADate = ADate - 1;
ElapsedDays = ADate -"1.1.1901";
Result = (ElapsedDays *400 /146097)+1901;
END
Она выбирала значение года в строке. Сейчас (Dialect 3) не выходит. Пишет ошибку.Помогите, пожалуйста.
...
Рейтинг: 0 / 0
Работа с датами
    #32140173
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно так, используя SUBSTR из стандартных UDF

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE EXTERNAL FUNCTION SUBSTR
    CSTRING( 80 ),
    SMALLINT,
    SMALLINT
RETURNS CSTRING( 80 ) FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';

...
cast((cast(SUBSTR( "dateField" , 1 , 4 ) as INTEGER) + 5 )||SUBSTR( "dateField" , 5 , 10 ) as DATE)
...

Если увеличивать надо было бы ровно на 4 года или кратно 4, то здесь конечно все проще (ровно 1 високосный год):

Код: plaintext
1.
 "dateField" + 1461 
 /* 365*4+1=1461 */ 
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Работа с датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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