Как я могу закрыть аукцион, когда наступит время закрытия? - PullRequest
0 голосов
/ 25 апреля 2019

Я занимаюсь разработкой сайта аукциона в реальном времени для школьного проекта. Мы не можем вносить какие-либо изменения в дизайн базы данных. В таблице «Товар» есть столбец для даты истечения срока (день окончания аукциона) и времени истечения (точное время, когда истекает аукцион). У этого также есть столбец, который указывает, открыт ли аукцион или закрыт. Этот столбец [AuctionClosed?] Необходимо обновить после достижения даты и времени истечения срока, что должно происходить в режиме реального времени.

Мы используем базу данных SQL Server, и веб-сайт работает на PHP7. Единственное возможное решение, которое я нашел, - запускать работу каждую секунду, но это слишком много.

Это функция, которую я хочу использовать для проверки столбца:

CREATE FUNCTION dbo.fn_isAuctionClosed (@Item BIGINT)
RETURNS BIT
AS
BEGIN
  DECLARE @expirationDay DATE = (SELECT expirationDate FROM Item WHERE itemId = @Item)
  DECLARE @expirationTime TIME = (SELECT expirationTime FROM Item WHERE itemId = @Item)

  IF 
  DATE(GETDATE()) = @expirationDay AND TIME(GETDATE()) >= @expirationTime
  OR
  DATE(GETDATE()) > @expirationDay
  RETURN 1

  RETURN 0
END

И это процедура, которая обновляет столбец:

CREATE PROCEDURE updateAuctionClosed @Item BIGINT
AS
UPDATE Item
SET [AuctionClosed?] = fn_isAuctionClosed(@Item)
WHERE itemId = @Item

1 Ответ

2 голосов
/ 25 апреля 2019

Если быть более точным, то, что вы действительно хотите здесь, это вычисляемый столбец. Как я уже говорил в комментариях, поскольку столбец будет опираться на текущую дату и время, столбец не будет детерминированным. Это означает, что он не может быть PERSISTED, но будет вычисляться при каждой ссылке на столбец (в столбце PERSISTED действительно хранится его значение, и он вычисляется, когда строка каким-либо образом обрабатывается и восстанавливается). Несмотря на это, его можно рассчитать следующим образом:

ALTER TABLE Item DROP COLUMN [AuctionClosed?]; --You can't alter a column to a computed column, so we have to DROP it first

ALTER TABLE Item ADD [AuctionClosed?] AS CASE WHEN CONVERT(datetime,expirationDate) + CONVERT(datetime, expirationTime) > GETDATE() THEN 1 ELSE 0 END;

На заметку, я рекомендую не использовать специальные символы в имени объекта. Придерживайтесь только буквенно-цифровых символов и (если необходимо) подчеркиваний (_), так как они не заставляют объект идентифицироваться как разделитель.

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