Каков наилучший способ обработки дат действия в приложениях? - PullRequest
0 голосов
/ 06 апреля 2010

Как мы моделируем эти объекты?

Сценарий 1: изменение цены за период времени

EffectiveDate  ExpiryDate    Price
2009-01-01     2009-01-31    800$
2009-02-01     Null          900$

Таким образом, если в 2009-02-15 цена изменится на 910 $, то система должна автоматически обновить дату истечения срока действия предыдущей действующей цены до 2009-02-14, чтобы она оставалась неизменной.

Сценарий 2: Цена не указана в период с 2009-02-01 по 2009-02-28

EffectiveDate  ExpiryDate    Price
2009-01-01     2009-01-31    800$
2009-03-01     Null          900$

Таким образом, если новая цена указана для 2009-02-15 и далее, то система должна автоматически установить дату истечения срока действия для вставляемой записи на 2009-02-28, поскольку уже запись вступает в силу с 2009-03- 01 существует.

Пожалуйста, предложите эффективный способ обработки этих сценариев для моделирования моей структуры, или есть какие-либо структуры, которые могут это сделать.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 апреля 2010

Если бы цена всегда действовала, тогда я бы использовал один столбец и использовал запросы, чтобы определить срок действия.

Create Table Prices
(
    EffectiveDate datetime not null
    , Price decimal(15,4) not null
    , Constraint UC_Prices_EffectiveDate Unique ( EffectiveDate )
)

Select P1.EffectiveDate As Start
    , Coalesce(
                    (
                    Select Min(P2.EffectiveDate) As EffectiveDate
                    From Prices As P2
                    Where P2.EffectiveDate > P1.EffectiveDate)
                    ), '9999-12-31') As End
    , Price
From Prices As P1

Этот более поздний запрос вы можете ввести в View, чтобы его можно было легко использовать в других запросах. Если вы попытаетесь сохранить как начало, так и срок действия, то вам нужно добавить кучу кода, возможно, в триггер, чтобы гарантировать, что у вас нет перекрытия или пропуска.

0 голосов
/ 06 апреля 2010

Я предполагаю, что в игре есть и другие столбцы, которые идентифицируют предмет, цена которого записывается.

Вы должны быть предельно осторожны, когда система автоматически выполняет все виды обновлений.

Если пользователь регистрирует новую цену для THING1, но делает это случайно (потому что он намеревался зарегистрировать новую цену для THING2): срок действия «текущей» цены для THING1 истекает, но она также автоматически отменяется при ошибка обнаружена и исправлена?

Если вы думаете, что можете сделать это, как вы собираетесь вернуть старую дату истечения срока действия (вы не можете быть уверены, что она была нулевой, потому что ваш бизнес может быть таким, что дата истечения уже была установлена ​​на некоторое известная дата в будущем)?

Как вы будете реагировать на требования к ретроактивным обновлениям?

Etc. и т.д.

...