Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Абонентская плата и PostgreSQL  (Прочитано 7854 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 11-11-2007 02:05 » 

Необходимо решить следующую задачу:

в таблице пользователей users есть поле registered_at в которое записывается дата регистрации в системе

Код:
CREATE TABLE users (
 ...
 balance numeric NOT NULL,
 registered_at timestamp NOT NULL,
 rate_id integer REFERENES rates
);

в таблице с тарифами есть поле period - период (в днях), через который должна сниматься абнентская плата

Код:
CREATE TABLE rates (
 ...
 period interval NOT NULL,
 fee numeric NOT NULL
);

Каким образом определить пользвателей со счёта которых нужно снять абонентскую плату на текущий день (CURRENT_DATE) ?
« Последнее редактирование: 11-11-2007 02:07 от Mfcer__ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-11-2007 13:23 » new

Что за тип interval? Какие значения он будет принимать?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 11-11-2007 14:07 » 

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

P.S. Это при условии, что проверка выполняется не чаще, чем раз в сутки. В противном случае никак - нужно хранить дату последнего начисления абон.платы, иначе абон.плата пользователю может быть начислена несколько раз.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 11-11-2007 14:11 » 

Я правильно понимаю - абон. плата должна выставляться через каждый прошедший интервал?
идея простая: отнимаем от текущей даты дату регистрации и проверяем делится ли она нацело на период (остаток=0)
в синтаксисе ПостгреСКЛ получение остатка будет приблизительно так:
Код:
date_part('day', date_trunc('day', current_date-date_trunc('day', registered_at) + interval '2 hours'))::integer%date_part('day', period)::integer
(поправка + interval '2 hours' - это чтобы учесть переход летнее/зимнее время, если тип timestamp with timezone)
RXL, http://www.postgresql.org/docs/8.0/static/datatype-datetime.html
Абсолютно согласен с dimka про раз в сутки!
Записан
Mfcer__
Команда клуба

ru
Offline Offline

« Ответ #4 : 13-11-2007 02:47 » 

СПАСИБО!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines