powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / DATE as INTEGER
3 сообщений из 3, страница 1 из 1
DATE as INTEGER
    #32555575
olol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет кого не знаю (а не знаю я всех)…
Этот вопрос наверняка уже рассматривался и не один раз…
Хочу поделиться своими мыслями (возможно глупыми… тогда можете не читать)…

IB практически не имеет встроенных функций преобразования данных.
Все решается с помощью внешних UDF и только числовые поля можно вычислять и менять при необходимости...

Следовательно, если дату хранить в виде числа дней, то возможна любая обработка и ее
изменение внутренними средствами без использования UDF.
Если работать с датой без времени, то можно ее хранить как INTEGER.

Я написал для примера процедурки Encode/Decode… (привожу дальше)
Прошу не судить строго… (толком их еще и не проверил)…
Это только ПРИМЕР, на основе которого можно сделать другие… (получение первого и последнего дня месяца и др.)

При расчетах я использовал следующие числа:

1G = 365 365
4G = 1G * 4 + 1 1461
100G = 4G * 25 - 1 36524
1000G = 100G * 10 + 1 365241

Если выполнить следующее:

Код: plaintext
1.
2.
EXECUTE PROCEDURE peEDay ( 1900 ,  2 ,  28 ) RETURNING_VALUES :L, :N;
N = N +  1 ;
EXECUTE PROCEDURE peDDay (:N) RETURNING_VALUES :L, :Y, :M, :D;

То получим: 0, 1900, 3, 1 (1900 г – не високосный)

Учтите – что если на Delphi или C++Builder дату присвоить int, то нулем будет 30.12.1899
А также: - для показа в гриде нужно вычисляемое поле, а для редактирования - обычный TMaskEdit (TDBEdit не подойдет).

В принципе из INTEGER можно получить CHAR и DATE (чего не скажешь об обратном преобразовании, хотя тоже можно… только придется повозиться с получением INTEGER из CHAR).

Кусочек SQL:

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
 /*--- 04.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peDiv2i;*/ 
SET TERM ^;
CREATE PROCEDURE peDiv2i (n1 INTEGER, n2 INTEGER)
  RETURNS (i INTEGER, n INTEGER)
  AS DECLARE VARIABLE f DOUBLE PRECISION;
  BEGIN
    IF (n1 IS NULL) THEN n1 =  0 ;
    f = n1; i = f / n2 +  0 . 5 ; i = i -  1 ; n = n1 - i * n2;
  END ^
SET TERM ;^
 /*--- 09.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peEYear;*/ 
SET TERM ^;
CREATE PROCEDURE peEYear (Y INTEGER)
  RETURNS (L INTEGER, n INTEGER)
  AS DECLARE VARIABLE i INTEGER;
  BEGIN
    EXECUTE PROCEDURE peDiv2i (:Y,  1000 ) RETURNING_VALUES :i,:Y;
    n =  365241  * i; L =  1 ;
    IF (Y >=  100 ) THEN BEGIN
      EXECUTE PROCEDURE peDiv2i (:Y,  100 ) RETURNING_VALUES :i,:Y;
      n = n +  36524  * i +  1 ; L =  0 ; END
    IF (Y >=  4 ) THEN BEGIN
      EXECUTE PROCEDURE peDiv2i (:Y,  4 ) RETURNING_VALUES :i,:Y;
      n = n +  1461  * i; IF (L =  0 ) THEN n = n -  1 ; L =  1 ; END
    IF (Y >  0 ) THEN BEGIN
      n = n +  365  * Y + L; L =  0 ; END
  END ^
SET TERM ;^
 /*--- 09.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peEMonth;*/ 
SET TERM ^;
CREATE PROCEDURE peEMonth (Y INTEGER, M INTEGER)
  RETURNS (L INTEGER, n INTEGER)
  AS BEGIN
    EXECUTE PROCEDURE peEYear (:Y) RETURNING_VALUES :L,:n;
    IF (M >  1 )
    THEN BEGIN n = n +  31 ;
      IF (M >  2 )
      THEN BEGIN n = n +  28  + L;
        IF (M >  3 )
        THEN BEGIN n = n +  31 ;
          IF (M >  4 )
          THEN BEGIN n = n +  30 ;
            IF (M >  5 )
            THEN BEGIN n = n +  31 ;
              IF (M >  6 )
              THEN BEGIN n = n +  30 ;
                IF (M >  7 )
                THEN BEGIN n = n +  31 ;
                  IF (M >  8 )
                  THEN BEGIN n = n +  31 ;
                    IF (M >  9 )
                    THEN BEGIN n = n +  30 ;
                      IF (M >  10 )
                      THEN BEGIN n = n +  31 ;
                        IF (M >  11 )
                        THEN n = n +  30 ;
    END END END END END END END END END END
  END ^
SET TERM ;^
 /*--- 03.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peEDay;*/ 
SET TERM ^;
CREATE PROCEDURE peEDay (Y INTEGER, M INTEGER, D INTEGER)
  RETURNS (L INTEGER, n INTEGER)
  AS BEGIN
    EXECUTE PROCEDURE peEMonth (:Y,:M) RETURNING_VALUES :L,:n;
    n = n + D -  1 ;
  END ^
SET TERM ;^
 /*--- 09.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peDYear;*/ 
SET TERM ^;
CREATE PROCEDURE peDYear (i INTEGER)
  RETURNS (L INTEGER, Y INTEGER, n INTEGER)
  AS BEGIN
    EXECUTE PROCEDURE peDiv2i (:i,  365241 ) RETURNING_VALUES :i,:n;
    Y =  1000  * i; L =  1 ;
    IF (n >  36524 ) THEN BEGIN n = n -  1 ;
      EXECUTE PROCEDURE peDiv2i (:n,  36524 ) RETURNING_VALUES :i,:n;
      Y = Y +  100  * i; L =  0 ; END
    IF (n >=  1460  + L) THEN BEGIN IF (L =  0 ) THEN n = n +  1 ;
      EXECUTE PROCEDURE peDiv2i (:n,  1461 ) RETURNING_VALUES :i,:n;
      Y = Y +  4  * i; L =  1 ; END
    IF (n >=  365  + L) THEN BEGIN n = n - L;
      EXECUTE PROCEDURE peDiv2i (:n,  365 ) RETURNING_VALUES :i,:n;
      Y = Y + i; L =  0 ; END
  END ^
SET TERM ;^
 /*--- 09.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peDMonth;*/ 
SET TERM ^;
CREATE PROCEDURE peDMonth (i INTEGER)
  RETURNS (L INTEGER, Y INTEGER, M INTEGER, n INTEGER)
  AS BEGIN
    M =  1 ; EXECUTE PROCEDURE peDYear (:i) RETURNING_VALUES :L,:Y,:n;
    IF (n >=  31 )
    THEN BEGIN M =  2 ; n = n -  31 ;
      IF (n >=  28  + L)
      THEN BEGIN M =  3 ; n = n -  28  - L;
        IF (n >=  31 )
        THEN BEGIN M =  4 ; n = n -  31 ;
          IF (n >=  30 )
          THEN BEGIN M =  5 ; n = n -  30 ;
            IF (n >=  31 )
            THEN BEGIN M =  6 ; n = n -  31 ;
              IF (n >=  30 )
              THEN BEGIN M =  7 ; n = n -  30 ;
                IF (n >=  31 )
                THEN BEGIN M =  8 ; n = n -  31 ;
                  IF (n >=  31 )
                  THEN BEGIN M =  9 ; n = n -  31 ;
                    IF (n >=  30 )
                    THEN BEGIN M =  10 ; n = n -  30 ;
                      IF (n >=  31 )
                      THEN BEGIN M =  11 ; n = n -  31 ;
                        IF (n >=  30 )
                        THEN BEGIN M =  12 ; n = n -  30 ;
    END END END END END END END END END END END
  END ^
SET TERM ;^
 /*--- 09.06.2004 -----------------------------------------------*/ 
 /*DROP PROCEDURE peDDay;*/ 
SET TERM ^;
CREATE PROCEDURE peDDay (i INTEGER)
  RETURNS (L INTEGER, Y INTEGER, M INTEGER, D INTEGER)
  AS BEGIN
    EXECUTE PROCEDURE peDMonth (:i) RETURNING_VALUES :L,:Y,:M,:D; D = D +  1 ;
  END ^
SET TERM ;^
 /*-----------------------------------------------------------------*/ 

Успехов ВАМ… Дерзайте…
zow@temz.tomsk.ru
...
Рейтинг: 0 / 0
DATE as INTEGER
    #32555880
Фотография Johnmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Успехов ВАМ…

Спасибо.

>Дерзайте…

Дерзаю, и утверждаю, что проблемы надуманны !

...
Рейтинг: 0 / 0
DATE as INTEGER
    #32555968
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
>Успехов ВАМ… 

Спасибо.

>Дерзайте…

Дерзаю, и утверждаю, что проблемы надуманны !

Ну чего человека обламываешь :) Изобретать велосипеды полезно. Зато не будет потом вопросов типа "Как мне быстренько сделать так, чтобы над проблемой не думать и все работало"

Удачи.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / DATE as INTEGER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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