假设我有一个表tbl_Room
,其中包含taken (boolean)
列,而客户希望在短期内租用此房间。
现在,我可以告诉mysql根据时间戳自动更改taken
的值,例如: G。如果租金时间/期限结束,taken
的值应自动设置为false。
或者我是否需要使用CRON或服务器上定期运行的其他脚本更新数据库?
答案 0 :(得分:1)
请使用mysql事件进行管理。
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
在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采取的功能