|
|
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
Господа программисты, помогите с такой проблемой - как известно у интербаси разница дат с дельфей есть вот только какая у 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 ***************************** Однако эта разница не действует какая она теперь может кто решал подобные задачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2003, 17:30 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
Привет. У меня стоит 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; =================== Надеюсь тебе поможет. я в свое время долго бился над єтим же вопросом. Если что - обращайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2003, 20:27 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
обращаюсь - исходные данные 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' может я чего не вижу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2003, 13:33 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2003, 17:50 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
Да и еще прямо преобразуй строку к типу с помощью cast Код: plaintext 1. 2. 3. 4. 5. 6. кстати в посте у тебя лишнее двоеточие '01.11.2003: 12:34:12' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2003, 18:07 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
А ты попробуй все сделать вот так, и у тебя все выйдет. 1. Заведи какое-нибудь поле T Timestamp; 2. Выполни: select DateToString(T) from table1; У меня все выходит. P.S. Привожу цитату из умной книги: "Тип Pchar Паскаля эквивалентен типу CSTRING в Interbase". Если будешь использовать varchar при объявлении UDF, то получишь галиматью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2003, 23:46 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
Я не использую Varchar при объявлении UDF, после выходных еще раз попробую, однако цель этого всего просто преобразовать тип DateTime FB->Delphi, вот и все. Хотя все описанные действия проделал получаю отрицательное значение даты, может у 7 Delphi другой отсчет даты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2003, 01:20 |
|
||
|
Help FireBird 1.0 Дата передача в UDF
|
|||
|---|---|---|---|
|
#18+
Maks_f писал:может у 7 Delphi другой отсчет даты Все мной выше приведенное компилилось именно под Delphi7 и работает, так что отсчет даты тут не при чем, копай в другом месте. Да попробуй выдать прямо в UDF мессагу, что-то вроде: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. может так определишь на каком этапе у тебя глюк при передаче, при расчете или при возврате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2003, 12:24 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32325590&tid=1579649]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
193ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 503ms |

| 0 / 0 |
