убедившись, что expiration_date - X попадает в допустимую date_of_price (если нет, используйте следующую действительную date_of_price) - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть две таблицы. Первая таблица имеет два столбца: ID и date_of_price. Поле date_of_price пропускает выходные дни и праздничные дни, когда рынки закрыты.

table: trading_dates
ID    date_of_price
1     8/7/2008
2     8/8/2008
3     8/11/2008
4     8/12/2008

Вторая таблица также имеет два столбца: ID и expiration_date. Поле expiration_date - это один день каждого месяца, когда истекает срок действия опций.

table: expiration_dates
ID    expiration_date
1     9/20/2008
2     10/18/2008
3     11/22/2008

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

Например, скажем, мы вычитаем 41 день из даты истечения срока действия. 41 день до 20.09.2008 - 8.10.2008. Поскольку 10.10.2008 не является действительной датой_доставки, мы должны пропустить 10.10.2008. Запрос должен вернуть 8/11/2008, что является следующей действительной датой_прибыла.

Любой совет будет оценен! : -)

1 Ответ

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

Это вычтет 41 день из даты с ID = 1 в expirations_dates и найдет ближайшее date_of_price.

Запрос

Изменить идентификатор и 41 на разные даты.

SELECT date_of_price 
FROM trading_dates 
WHERE date_of_price >= (
    SELECT DATE_SUB(expiration_date, INTERVAL 41 DAY)
    FROM expiration_dates
    WHERE ID=1
) 
ORDER BY date_of_price ASC 
LIMIT 1;

Производительность

Чтобы получить максимальную производительность от этого запроса, ваша таблица trading_dates должна иметь кластеризованный индекс на date_of_price (это сделает ORDER BY запретом) и, конечно, индекс первичного ключа на expirations_dates.ID (чтобы быстро найти дату истечения срока действия).

Не включайте кластерный индекс вслепую. Если вы обновляете или вставляете значения чаще, чем ищите истечения, подобные этому, не вставляйте их, поскольку все ваши вставки / обновления будут иметь дополнительные издержки для сохранения кластеризованного индекса.

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