【发布时间】:2019-04-25 17:41:15
【问题描述】:
我正在为一个学校项目开发一个实时拍卖网站。我们无法对数据库的设计进行任何更改。 'Item' 表有一列表示到期日期(拍卖到期的日期)和到期时间(拍卖到期的确切时间)。它还有一个列,指示拍卖是打开还是关闭。此 [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
【问题讨论】:
-
改用计算列。达到特定时间时,您无法使 SP 运行。
-
但是这个计算出来的列不会实时更新吧?您是指 DEFAULT 约束吗?
-
由于该列会依赖
GETDATE(),所以不能使用PERSISTED属性,每次引用该列时都会在运行时计算。 -
好的,我要试试这个,非常感谢!那么我应该为此使用 DEFAULT 约束吗?
-
您的
dbo.fn_isAuctionClosed函数无论如何都不正确。如果拍卖在 4 月 1 日 17:00 结束,并在 4 月 2 日 09:00 查询该函数,则表示拍卖仍在进行中,因为时间较少
标签: sql-server tsql