如何更新仅依赖于时间戳的mysql db列?

时间:2017-06-11 13:04:16

标签: mysql database-design auto-update

假设我有一个表tbl_Room,其中包含taken (boolean)列,而客户希望在短期内租用此房间。

现在,我可以告诉mysql根据时间戳自动更改taken的值,例如: G。如果租金时间/期限结束,taken的值应自动设置为false。

或者我是否需要使用CRON或服务器上定期运行的其他脚本更新数据库?

3 个答案:

答案 0 :(得分:1)

请使用mysql事件进行管理。

CREATE EVENT [IF NOT EXIST]  event_name
ON SCHEDULE schedule
DO
event_body

Reference

event_body下,您可以编写select语句来检查句点,然后在句点结束时更新表格。

答案 1 :(得分:1)

处理这种基于时间的请求的最佳方法是违反直觉的。

请勿尝试在特定时间更新表格。相反,请添加一个名为lease_expires_at的时间戳列。

租用房间时,请更新行以将lease_expires_at的值设置为租借期限到期的时间。例如,如果您从现在开始租用房间30分钟,请执行此操作。

  UPDATE room
     SET lease_expires_at = NOW() + INTERVAL 30 MINUTE
   WHERE room_number = whatever

如果您想知道房间目前是否(NOW()),请执行以下操作:

 SELECT room_number,
        CASE WHEN lease_expires_at IS NULL THEN 0
             WHEN lease_expires_at <= NOW() THEN 0
             ELSE 1 END taken
   FROM room
  WHERE room = whatever

如果您想知道一个小时后房间是否可用(NOW() + INTERVAL 60 MINUTE),请执行以下操作:

 SELECT room_number,
        CASE WHEN lease_expires_at IS NULL THEN 0
             WHEN lease_expires_at <= NOW() + INTERVAL 60 MINUTE THEN 0
             ELSE 1 END taken
   FROM room
  WHERE room = whatever

然后,偶尔,但不是以任何时间关键的方式,你可以使用像这样的查询清理东西

  UPDATE room SET lease_expires = NULL WHERE lease_expires <= NOW()

您可以使用事件,或夜间cronjob,或任何您想要的,来进行此清理。应用程序的完整性并不完全取决于此作业的运行时间。

这样做的好处应该是明确的:如果您依赖某些定期运行的流程设置taken列值,并且该流程不运行或运行较晚,则会得到错误的结果。当您依靠时间时,您将获得准确的结果。

这个设计中有一个小的边界条件细节。通过在我的查询中使用<=,我选择让lease_expires_at时间戳代表房间可用于另一个租约的第一个时刻,而不是当前租约的最后一刻。这是一个方便的选择,因为如果你把2017-11-2017 11:00:00之类的东西放到lease_expires_at中,而有人说&#34;那个房间在11:00可用?&#34;你希望能够轻松地说'是的。&#34;在10:30租用它的人直到11点之前才开始。

答案 2 :(得分:-2)

你可以使用jquery时间选择器....你可以创建一个if循环,其中JavaScript时间函数将检查当前时间...到其原始时间......如果条件满足...我们可以更改mysql采取的功能