C# 在特定日期/时间运行SQL
我有一个Microsoft SQL数据库,其中包含一个名为Bookings的表,该表有一个列EndDate和一个列Status 无论何时在Bookings中插入一行,它都会将状态设置为“不可用”,并插入一个结束日期,如从现在开始的一周 我想做的是,当当前日期和时间等于EndDate时,自动将状态从“不可用”更新为“可用” 我无法使用SQL Server代理作业,因为我正在运行Express EditionC# 在特定日期/时间运行SQL,c#,sql,sql-server,date,model-view-controller,C#,Sql,Sql Server,Date,Model View Controller,我有一个Microsoft SQL数据库,其中包含一个名为Bookings的表,该表有一个列EndDate和一个列Status 无论何时在Bookings中插入一行,它都会将状态设置为“不可用”,并插入一个结束日期,如从现在开始的一周 我想做的是,当当前日期和时间等于EndDate时,自动将状态从“不可用”更新为“可用” 我无法使用SQL Server代理作业,因为我正在运行Express Edition 谢谢如果你需要不断地执行这个逻辑,如果你不能使用SQL代理,也许你需要考虑一个简单的应用程
谢谢
如果你需要不断地执行这个逻辑,如果你不能使用SQL代理,也许你需要考虑一个简单的应用程序,比如Windows服务或控制台应用程序。这可以由Windows Scheduler每天触发一次,它将检查数据库中的所有记录,检查您的条件是否满足,并在必要时更新记录?您可以通过使用sqlcmd运行服务或脚本来实现这一点,但我倾向于后退一步,看看基本要求
在那个确切的时间,状态必须改变到什么目的?您正在查找的输出数据听起来似乎可以使用视图而不是持久化字段来更好地完成,而且复杂性要低得多。不更新状态列的解决方案可能就足够了。您的可用行是那些EndDate大于或等于GETUTCDATE的行(假设EndDate为UTC)这是一条您想要走的危险路径。一旦您现在有了包含无效数据的行,就会错过这个过程。更不用说,您花费了大量的处理时间和维护时间来标记一个列,您应该能够在任何时间点确定该列 不要试图在数据库中维护重复的数据,这些数据总是不同步,只需在运行时计算数据或创建视图来显示数据:
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
如果我听到你的声音,试着用触发器INSERT@MegaTron说得对。插入它的触发器是!!!尤里卡!!!尤里卡!!!另一种选择是使用计算列。只需在列中添加逻辑,无需执行任何其他操作。下一个最佳选择是下面发布的Tom H视图。@SimonKarlsson Quartz当然是一个选项,但需要安装外部应用程序-由Windows任务计划程序运行的控制台应用程序不需要安装任何外部应用程序。如果你发现它更容易使用,这是一个很好的选择。@Jake但是如果你使用quartz,你将拥有一个自包含的应用程序,它比在任务调度程序中运行更干净。到今天为止,使用第三方库并没有什么错,现在很多人犯了一个错误,重新发明了轮子,而不是使用现有的库。最简单的形式是,控制台应用程序将连接到SQL并运行存储过程,即使使用Quartz,这部分代码也将保持不变。要解决让它在某个时间运行的问题,您可以a.打开计算机上现有的应用程序,设置时间并将其指向脚本,或者B.安装新的应用程序并学习如何使用它来实现相同的结果。我使用Quartz处理更复杂的事情,但是如果你有一个单一的控制台应用程序以固定的时间间隔运行,它并不是完全重新发明轮子