powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка на непересекаемость интервалов
5 сообщений из 5, страница 1 из 1
Проверка на непересекаемость интервалов
    #34889715
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
change_tarifs
id_ch_t int
id_tarifs int
id int
date_start timestamp (дата начала действия тарифа)
date_end timestamp (дата конца действия тарифа)
Как можно сделать проверку на уровне БД на непересекаемость интервалов (date_start-date_end) для одного клиента (у одного клиента не может быть два тарифа одновременно)? Еще неплохо бы сделать проверку на то, чтоб у клиента не было периода времени без выбранного тарифа (на операторов нельзя надеяться).
Заранее спасибо за ответы.
...
Рейтинг: 0 / 0
Проверка на непересекаемость интервалов
    #34889731
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно поменять структуру данных.
Все твои сложности - из-за неправильно выбранной модели данных.

Зачем тебе хранить дату окончания действия тарифа?
Достаточно хранить только дату начала.
И тогда вся таоя головная боль исчезнет.
Периоды действия тарифов не будут пересекаться, так как начало действия одного тарифа будет, по сути, датой окончания действия другого . Также не будет интервалов с неустановленным тарифом.

Тогда вся твоя проверка сведется к двум чек-констрейнтам: первый будет проверять уникальность сочетания полей <идентификатор клиента>/<дата начала действия тарифа> (фактически составной уникальный ключ)
Вторая будет проверять отсутствие пустых значений в поле с тарифом.
Обе проверки элементрано реализуются средствами обеспечения целостности данных на уровне СУБД.
...
Рейтинг: 0 / 0
Проверка на непересекаемость интервалов
    #34890061
Gold_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
глянь здесь
мне правда не ответили на мои вопросики.. видимо не правильно задал )
рад что смог поднять свою тему ))
...
Рейтинг: 0 / 0
Проверка на непересекаемость интервалов
    #34890127
postuser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бабичев СергейНужно поменять структуру данных.
Все твои сложности - из-за неправильно выбранной модели данных.

Зачем тебе хранить дату окончания действия тарифа?
Достаточно хранить только дату начала.
И тогда вся таоя головная боль исчезнет.
Периоды действия тарифов не будут пересекаться, так как начало действия одного тарифа будет, по сути, датой окончания действия другого . Также не будет интервалов с неустановленным тарифом.

Тогда вся твоя проверка сведется к двум чек-констрейнтам: первый будет проверять уникальность сочетания полей <идентификатор клиента>/<дата начала действия тарифа> (фактически составной уникальный ключ)
Вторая будет проверять отсутствие пустых значений в поле с тарифом.
Обе проверки элементрано реализуются средствами обеспечения целостности данных на уровне СУБД.
Спасибо за совет, структуру переделал, теперь эти проблемы решились.
Хотел бы еще поинтересоваться, как лучше делать детализацию счета (лог денежных списаний). Сейчас делается примерно так (упрощенно):
1) Определяется сумма и id клиента;
2) UPDATE аккоунт SET баланс=баланс-СУММА WHERE id клиента=ID;
3) INSERT детализация (id клиента, сумма, тип услуги (номер),дата) VALUES (ID, SUM, 1,'2007-10-10');
Или лучше сначала делать вставку в таблицу детализации, а потом по триггеру на нее (таб детализации) делать UPDATE таблицы аккаунтов?
...
Рейтинг: 0 / 0
Проверка на непересекаемость интервалов
    #34893899
Бабичев Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
postuserСпасибо за совет, структуру переделал, теперь эти проблемы решились.
Хотел бы еще поинтересоваться, как лучше делать детализацию счета (лог денежных списаний). Сейчас делается примерно так (упрощенно):
1) Определяется сумма и id клиента;
2) UPDATE аккоунт SET баланс=баланс-СУММА WHERE id клиента=ID;
3) INSERT детализация (id клиента, сумма, тип услуги (номер),дата) VALUES (ID, SUM, 1,'2007-10-10');
Или лучше сначала делать вставку в таблицу детализации, а потом по триггеру на нее (таб детализации) делать UPDATE таблицы аккаунтов?IMHO, как делается - так и правильно. Ибо вначале мы изменяем основную сущность и в случае успешного её изменения делаем запись детальной информации по проведенной операции.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка на непересекаемость интервалов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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