【问题标题】:Run SQL at a certain date/time在某个日期/时间运行 SQL
【发布时间】:2016-06-21 05:12:44
【问题描述】:

我有一个 Microsoft SQL 数据库,其中包含一个名为 Bookings 的表,其中有一列 EndDate 和一列 Status。

每当在 Bookings 中插入一行时,它都会将 Status 设置为不可用并插入 EndDate(比如从现在开始的一周)。

我想要做的是在当前日期和时间等于 EndDate 时自动将状态从不可用更新为可用。

我无法使用 SQL Server 代理作业,因为我正在运行 Express Edition。

谢谢

【问题讨论】:

  • 如果我正确地理解了你,然后尝试使用触发器 FOR INSERT
  • @MegaTron 已正确提及。插入的触发器是!!!尤里卡!!!尤里卡!!!
  • 另一种选择是使用计算列。只需在列中添加逻辑,无需执行任何其他操作。下一个最佳选择是下面发布的 Tom H 之类的视图。

标签: c# sql sql-server date model-view-controller


【解决方案1】:

这是一条你想走的危险路。一旦您现在有了包含无效数据的行,就会错过这个过程。更不用说,您花费了大量的处理时间(和维护)只是为了标记一个您应该能够在任何时间点确定的列。

不要试图在数据库中维护重复数据(这总是会不同步),只需在运行时计算它或创建一个视图来呈现它:

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

【讨论】:

    【解决方案2】:

    如果您需要不断地执行此逻辑并且无法使用 SQL 代理,那么您可能需要考虑一个简单的应用程序,例如 Windows 服务或控制台应用程序。 这可以由 Windows 调度程序每天触发一次,它将遍历您数据库中的所有记录,检查您的条件是否满足并在必要时更新记录?

    【讨论】:

    • @SimonKarlsson Quartz 当然是一个选项,但需要安装外部应用程序 - 由 Windows 任务调度程序运行的控制台应用程序不需要安装任何外部应用程序。如果您发现它更易于使用,这是一个不错的选择。
    • @Jake 但是,如果您使用石英,您将拥有一个独立的应用程序,它比在任务调度程序中运行更干净。到今天为止,使用 3rd 方库并没有什么问题,现在很多人都犯了这个错误,重新发明轮子而不是使用现有的库。
    • 在最简单的形式中,控制台应用程序将连接到 SQL 并运行存储过程,即使使用 Quartz,这部分代码也将保持不变。要解决让它在某个时间运行的问题,您可以 A. 在计算机上打开现有应用程序,设置时间并将其指向脚本,或者 B. 安装新应用程序并学习如何使用它来达到相同的结果。我将 Quartz 用于更复杂的事情,但如果您有一个定期运行的控制台应用程序,那并不是完全“重新发明轮子”
    【解决方案3】:

    您可以通过使用 sqlcmd 运行的服务或脚本来执行此操作,但我倾向于退后一步,看看基本要求。

    状态必须在那个确切时间改变到什么目的?您正在寻找的输出数据听起来很像是使用视图而不是持久字段可以更好地完成,而且复杂性要低得多。

    【讨论】:

      【解决方案4】:

      不更新状态列的解决方案可能就足够了。您的“可用”行是 EndDate 大于或等于 GETUTCDATE() 的行,假设 EndDate 为 UTC

      【讨论】:

        猜你喜欢
        • 2019-09-21
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 2016-09-19
        • 2023-03-16
        • 2012-05-04
        • 2023-01-28
        • 1970-01-01
        相关资源
        最近更新 更多