Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/121: Рейтинг темы: голосов - 121, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 19.12.2013
Сообщений: 16

Подсчет разницы между датами

29.05.2015, 10:31. Показов 23661. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. В данный момент изучаю postgreSQL. Пишу простенькую БД для учета трат,доходов)
Имеется такая таблица. В поле dealDate записывается текущее время при создании записи.
Теперь возникла задача, когда долг гасится, в зависимости от флага необходимо посчитать количество месяцев и количество лет, между временем записанным в таблице и now.
Не могу допереть, как это сделать.
Вот сама таблица:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE "Debtor" (
"debtor_id"  SERIAL NOT NULL /* идентификатор должника */,
"name" VARCHAR(100) NOT NULL /* имя должника */,
"amount" MONEY NOT NULL DEFAULT 0 /* сумма долга */,
"flagRefund" BOOLEAN NOT NULL DEFAULT '0' /* флаг погашения */,
"interestRate" SMALLINT NOT NULL DEFAULT 0 /* процентная ставка */,
"dealDate" DATE NOT NULL DEFAULT CURRENT_TIMESTAMP /* дата сделки */,
"flagDisposableAccrualInterest" BOOLEAN NOT NULL DEFAULT '1' /* флаг одноразового начисления процентов */,
"flagMonthlyInterestCharge" BOOLEAN NOT NULL DEFAULT '0' /* флаг ежемесячного начисления процентов */,
"flagAnnualInterestCharge" BOOLEAN NOT NULL DEFAULT '0' /* флаг ежегодного начисления процентов */,
"flagDelete" BOOLEAN NOT NULL DEFAULT '0' /* флаг удаления записи */,
"accountMoney_id_AccountMoney" INTEGER NOT NULL /* идентификатор счёта */,
"user_id_User" INTEGER NOT NULL /* идентификатор пользователя */,
PRIMARY KEY ("debtor_id")
);
Вот недоделанная функция, в которой необходимо узнать интервалы):

SQL
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
-- -- Погасить долг
-- -- 1. Рассчитать сумму, которую должник отдал нам:
--        если флаг одноразового начисления процентов трушный,
--        то
--        1.прибавляем к денежному счету(сумма долга)* (1+процент)
--        2.ставим флаг погашен 
--        если флаг ежемесячного начисления процентов трушный,
--        то
--        1. считаем количество месяцев  
--        2. прибавляем к денежному счету ФОРМУЛА
--        3. ставим флаг погашен
--        если флаг ежегодного начисления процентов трушный,
--        то
--        1. считаем количество месяцев  
--        2. прибавляем к денежному счету ФОРМУЛА
--        3. ставим флаг погашен
-- -- 2. Прибавить эту сумму к счету
--        
CREATE FUNCTION DebtRepaid(debtor_id_var INTEGER) RETURNS void AS 
'
DECLARE
  flagDisposableAccrualInterest_var BOOLEAN;
  flagMonthlyInterestCharge_var BOOLEAN;
  flagAnnualInterestCharge_var BOOLEAN;
  
  currBalance      MONEY;
  idUser           INTEGER;
  idAmountAccount  INTEGER; 
  sum              MONEY;
  finalSum         MONEY;
  interestRate_var SMALLINT;
  numberMonths     SMALLINT;
  numberYear       SMALLINT;
 
BEGIN
 
  -- Узнаем значение флага одноразового начисления процентов
  SELECT INTO flagDisposableAccrualInterest_var "flagDisposableAccrualInterest"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
  
  -- Узнаем значение флага ежемесячного начисления процентов
  SELECT INTO  flagMonthlyInterestCharge_var "flagMonthlyInterestCharge"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
  
  -- Узнаем значение флага ежегодного начисления процентов
  SELECT INTO flagAnnualInterestCharge_var "flagAnnualInterestCharge"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
 
  -- Узнаем сумму долга (без процентов)
  SELECT INTO sum "amount"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
 
  -- Узнаем процентную ставку 
  SELECT INTO interestRate_var "interestRate"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
 
  -- Узнаем идентификатор счёта
  SELECT INTO idAmountAccount "accountMoney_id_AccountMoney"
  FROM "Debtor"
  WHERE "debtor_id"= debtor_id_var;
 
  -- Узнаем текущий баланс счета
  SELECT INTO currBalance "currentBalance"
  FROM "AccountMoney"
  WHERE "accountMoney_id"= idAmountAccount;
 
  -- флаг одноразового начисления процентов
  IF (flagDisposableAccrualInterest_var = TRUE ) THEN
 
     currBalance:= currBalance+(currBalance*interestRate_var/100);
     -- Ставим флаг погажения долга
     UPDATE "Debtor" 
     SET 
     "flagRefund" = TRUE
     WHERE "debtor_id" = debtor_id_var;
 
     UPDATE "AccountMoney" 
     SET 
     "currentBalance"  = currBalance
     WHERE "accountMoney_id" = idAmountAccount;
  
  -- флаг ежемесячного начисления процентов
  ELSEIF (flagMonthlyInterestCharge_var  = TRUE) THEN
     --
     --
     -- Ставим флаг погажения долга
     UPDATE "Debtor" 
     SET 
     "flagRefund" = TRUE
     WHERE "debtor_id" = debtor_id_var;
  -- флаг ежегодного начисления процентов
  ELSEIF (flagAnnualInterestCharge_var  = TRUE) THEN
     --
     --
     -- Ставим флаг погажения долга
     UPDATE "Debtor" 
     SET 
     "flagRefund" = TRUE
     WHERE "debtor_id" = debtor_id_var;
  ELSE
    -- 
    -- 
    NULL;
  END IF;
    
END;
'
LANGUAGE plpgsql;
Прошу пояснить как считать интервалы в разных форматах: годах, месяцах, днях.
Есть ли готовые функции или же нужно будет умножать и делить на 60 секунды и часы на 24?
Так же при изучении данной СУБД я столкнулась с тем, что очень мало литературы русскоязычной, а с инглишем у меня беда. Подскажите, пожалуйста, русскоязычный источник, если таковой имеется.
И можно ли выполнять функцию по шагам и смотреть значение переменной на каждом шаге, как в студии от майкрасофта?
Заранее спасибо за ответы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.05.2015, 10:31
Ответы с готовыми решениями:

Получение разницы между датами
Доброго времени суток. Подскажите пожалуйста, как можно получить разницу между двумя датами в месяцах. Знаю что в MySQL для этого...

Расчёт разницы между датами в StringGrid
Доброго времени, помогите пожалуйста с расчётами. Имеется StringGrid c данными. Фото ниже. При нажатие на кнопку, хотел посчитать разницу...

Получение разницы между двумя датами
kak naibolee effectivno poschitat raznizu v days mezhdu 2 date v fomate 'smalldatetime'.naprimer: 07/01/2002 15:10:17 and ...

1
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
30.05.2015, 13:23
Цитата Сообщение от lerochka_pnz Посмотреть сообщение
Прошу пояснить как считать интервалы в разных форматах: годах, месяцах, днях.
Есть ли готовые функции или же нужно будет умножать и делить на 60 секунды и часы на 24?
Если одну дату (тип данных date) отнять от другой, тоо рехультат будет целое число, равное число дней между датами.
select '2015-05-02'::date - '2015-05-02'::date;
Здесь результат запрос будет -1

Если вычитать типы данных timestamp, то результатом будет тип данных interval, для которого есть много всяких функций
http://www.postgresql.org/docs... etime.html

Цитата Сообщение от lerochka_pnz Посмотреть сообщение
Так же при изучении данной СУБД я столкнулась с тем, что очень мало литературы русскоязычной, а с инглишем у меня беда. Подскажите, пожалуйста, русскоязычный источник, если таковой имеется.
Здесь можно сказать только одно: сожалею, учите английский. Погуглите, может некоторые разделы документации найдете в переводе.

Цитата Сообщение от lerochka_pnz Посмотреть сообщение
И можно ли выполнять функцию по шагам и смотреть значение переменной на каждом шаге, как в студии от майкрасофта?
Отладка есть, но боюсь, что ее установку и настройку в один пост не уместить. Погуглите pgadmin debugger и попробуйте следовать документации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.05.2015, 13:23
Помогаю со студенческими работами здесь

Определение разницы между датами в месяцах
Доброго времени суток уважаемые форумчане и коллеги по разуму! Ситуация такова, что очень часто я использовал в своих разработках...

Определение разницы между датами в днях
Всем привет! :) Задача в том что есть две даты ( день, месяц, год ) нужно определить разницу дв днях между ними)

Вычисление разницы между датами в часах
Привет всем. Помогите вычислить разницу в часах. Надо из ExitTime вычесть EnterTime и в новом столбце чтобы появилось эта разница. ...

Вычисление разницы между двумя датами на PHP
ув АЛЛ как вычислить разницу между двумя датами (хочу знать сколь времени юзер не проявляет активности). В БД МайСкл сидит дата когда...

Нахождение разницы в часах между двумя датами.
У меня есть две переменные s1 и s2. s1='2010-12-02 17:01:20'; (старт) s2='2010-12-03 00:20:30'; (конец) Мне нужно найти разницу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru