powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Help FireBird 1.0 Дата передача в UDF
8 сообщений из 8, страница 1 из 1
Help FireBird 1.0 Дата передача в UDF
    #32323469
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа программисты, помогите с такой проблемой - как известно у интербаси разница дат с дельфей есть вот только какая у Fb и Delphi 7
на Ibase есть следующее
*********************************
Для хранения даты и времени в IB DataBase существует тип date.
Внутреннее представление таково:
Это запись из двух 32 разрядных знаковых целых чисел.
В первом числе храниться число дней, прошедших с 17 ноября 1858, а во втором - число время в десятых долях миллисекунды, прошедшее после полуночи
PIBDateTime = ^TIBDateTime;
TIBDateTime = record
Days, // Date: Days since 17 November 1858
MSec10: Integer; // Time: Millisecond * 10 since midnigth
end;

В Delphi дата и время представлено типом TDateTime, который объявлен как TDateTime = type Double;

Целая часть это число дней, прошедших с 30 декабря 1899, а дробная часть время, прошедшее после полуночи (.0 = 0:00; .25 = 6:00; .5 = 12:00; .75 = 18:00 pm)

Таким образом, совсем не сложно преобразовать даты из формата IB DataBase в Delphi и наоборот.

Пример:

const // константы трансляции даты:
MSecsPerDay10 = MSecsPerDay * 10; // миллисекунд в сутках * 10
IBDateDelta = 15018; // разница в днях между датами Delphi 2.0 и IB Database
*****************************


Однако эта разница не действует какая она теперь может кто решал подобные задачи
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32323683
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.
У меня стоит Delphi5 и FireBird 1.0.3.
Вот как у меня работают функции для работы со временем.
===================

type
TIBDateTime = record
Days : Integer;
MSec : Cardinal;
end;
TIBTime = integer;
TIBDate = cardinal;

{ Эта функция к дате d прибавляет время t }
function IncDateOnTime(var d:TIBDateTime;var t:TIBTime):Pchar;cdecl;
var a,b : real;
begin
a := d.Days-15018 + d.MSec/(MSecsPerDay*10);
b := t/(MSecsPerDay*10);
result := PChar(DateTimeToStr(a+b));
end;
===================
Надеюсь тебе поможет. я в свое время долго бился над єтим же вопросом.
Если что - обращайся.
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32324420
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обращаюсь - исходные данные
type
TIBDateTime = record
Days: Integer; // Date: Days since 17 November 1858
MSec10: Cardinal; // Time: Millisecond * 10 since midnigth
end;

function DateToString(var IBDateTime: TIBDateTime): PChar cdecl; {export;}
var
DateTime: TDateTime;
begin
with IBDateTime do
DateTime := Days - 15018 + MSec10/(MSecsPerDay*10);
Result := PChar(DateToStr(DateTime));
end;

процедура

CREATE PROCEDURE P_GRAPH_BUILD(
STARTDATE$ TIMESTAMP,
ENDDATE$ TIMESTAMP)
RETURNS (
DATESTR VARCHAR(100))
AS
BEGIN
/* PROCEDURE TEXT */
DateStr = DateToString(:StartDate$);
SUSPEND;
END
вызов процедуры: Select * From P_graph_build('01.11.2003:12:34:12',Null)

Результат: '-724798--04--26'

может я чего не вижу
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32324996
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не понятно зачем ты заморачиваешься с MSec10, если хочешь вернуть только (DateToStr) дату. Тебе должно хватить только твоих days.
2. Если хочешь вернуть со временем, то надо DateTimeToStr

Для примера у меня для приведения дат к "русско-немецкому формату" используется:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Type
  PIBDate=^TIBDate;
  TIBDate=longint;    {= integer без разницы: integer - 2147483648 .. 2147483647  signed  32 -bit
                                              longint - 2147483648 .. 2147483647  signed  32 -bit}

function DatRuStr(var IBDate: TIBDate): PChar; cdecl; export;
Begin
  DatRuStr:=PChar(DateToStr(IBDate- 15018 )+# 0 ); 
 {возможно +# 0  уже лишнее, но у меня так}
End;

exports
  DatRuStr name 'DatRuStr';

begin
  ShortDateFormat:='dd.mm.yyyy';
 {на всякий случай, вдруг в системе другой будет}
end.

и объявление

DECLARE EXTERNAL FUNCTION  "DatRuStr" 
    DATE
RETURNS CSTRING( 10 )  /* а не varchar,
 возможно именно поэтому у тебя и не работает, 
но под дату со временем надо заложить ессно большую длину */ 
ENTRY_POINT 'DatRuStr' MODULE_NAME 'my_udf';

...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32325016
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и еще прямо преобразуй строку к типу с помощью cast

Код: plaintext
1.
2.
3.
4.
5.
6.
 /* для моей функции */ 

select  "DatRuStr" (cast('14.11.2003' as date)) from rdb$database;

 /* для твоей */ 

select DateToString(cast('01.11.2003 12:34:12' as timestamp)) from rdb$database;

кстати в посте у тебя лишнее двоеточие '01.11.2003: 12:34:12'
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32325202
lasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты попробуй все сделать вот так, и у тебя все выйдет.
1. Заведи какое-нибудь поле T Timestamp;
2. Выполни:
select DateToString(T) from table1;
У меня все выходит.

P.S.
Привожу цитату из умной книги:
"Тип Pchar Паскаля эквивалентен типу CSTRING в Interbase".
Если будешь использовать varchar при объявлении UDF, то получишь галиматью
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32325244
Maks_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не использую Varchar при объявлении UDF, после выходных еще раз попробую, однако цель этого всего просто преобразовать тип DateTime FB->Delphi, вот и все. Хотя все описанные действия проделал получаю отрицательное значение даты, может у 7 Delphi другой отсчет даты
...
Рейтинг: 0 / 0
Help FireBird 1.0 Дата передача в UDF
    #32325590
Acue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maks_f писал:может у 7 Delphi другой отсчет даты
Все мной выше приведенное компилилось именно под Delphi7 и работает, так что отсчет даты тут не при чем, копай в другом месте.
Да попробуй выдать прямо в UDF мессагу, что-то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
uses ... dialogs;
...
function DateToString(var IBDateTime: TIBDateTime): PChar; cdecl;
var 
  DateTime: TDateTime; 
begin 
  DateTime := IBDateTime.Days -  15018  + IBDateTime.MSec10/(MSecsPerDay* 10 ); 
  ShowMessage('IBDateTime.Days: '+IntToStr(IBDateTime.Days)+# 13 +
              'IBDateTime.MSec10: '+IntToStr(IBDateTime.MSec10)+# 13 +
              'MSecsPerDay: '+IntToStr(MSecsPerDay)+# 13 +
              'DateTime Delphi: '+DateTimeToStr(DateTime));
  Result := PChar(DateTimeToStr(DateTime)); 
end; 
...

может так определишь на каком этапе у тебя глюк при передаче, при расчете или при возврате.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Help FireBird 1.0 Дата передача в UDF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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