我有一个Microsoft SQL数据库,其中包含一个名为Bookings的表,其中包含EndDate列和一个列状态。
每当在预订中插入一行时,它会将状态设置为不可用并插入一个EndDate(从现在起一周)。
我想要做的是在当前日期和时间等于EndDate时自动将状态从不可用更新为可用。
因为我正在运行Express Edition,所以无法使用SQL Server代理作业。
由于
答案 0 :(得分:7)
这是一条你想要失败的危险道路。一旦此过程错过,您现在有一些包含无效数据的行。更不用说,你花费了大量的处理时间(和维护)来标记你应该能够在任何时间点确定的列。
不要试图在数据库中维护重复数据(这总是会不同步),而是在运行时计算它或创建一个视图来呈现它:
CREATE VIEW dbo.Bookings_WithStatus
AS
SELECT
booking_id,
start_date,
end_date,
CASE
WHEN COALESCE(end_date, GETDATE()) > GETDATE() THEN 'Unavailable'
ELSE 'Available'
END AS booking_status
FROM
dbo.Bookings
虽然逻辑很简单,但我可能甚至不愿意为自己的观点而烦恼。
@Sean Lange明确指出,这也可以作为计算列完成,这可能比使用视图更好:
ALTER TABLE dbo.Bookings
DROP COLUMN booking_status
ALTER TABLE dbo.Bookings
ADD booking_status AS
CASE
WHEN COALESCE(end_date, GETDATE()) > GETDATE() THEN 'Unavailable'
ELSE 'Available'
END
答案 1 :(得分:1)
如果您需要不断地执行此逻辑,并且如果您不能使用SQL Agent,则可能需要考虑一个简单的应用程序,如Windows服务或控制台应用程序。 这可以由Windows Scheduler每天触发一次,它将遍历数据库中的所有记录,检查您的条件是否已满足并在必要时更新记录?
答案 2 :(得分:1)
您可以通过使用sqlcmd运行的服务或脚本来执行此操作,但我倾向于退后一步并查看基本要求。
状态必须在那个确切的时间发生变化?您正在寻找的输出数据听起来很像使用视图而不是持久字段可以更好地完成,而且复杂性要低得多。
答案 3 :(得分:0)
不更新状态列的解决方案可能就足够了。您的“可用”行是EndDate大于或等于GETUTCDATE()的行,假设EndDate是UTC