【发布时间】:2014-11-21 17:04:22
【问题描述】:
我在 phpMyAdmin 中编写了这个触发器
BEGIN
DECLARE start DATETIME;
DECLARE now DATETIME;
DECLARE date DATETIME;
SELECT `starting` INTO start FROM events WHERE events.id = NEW.event_id;
SET now = NOW();
SET date = CURDATE();
IF start > now THEN
IF DATE(start) = date THEN
SET @hours = HOUR(start - now);
IF @hours <= 1 THEN
SET @text = 'in less than an hour';
ELSE
SET @text = CONCAT('in about ', @hours, ' hours');
END IF;
INSERT INTO notifications (user_id, subject, action_id, data, seen, activates)
VALUES (NEW.user_id, NEW.event_id, 2, CONCAT('{"period":"', @text, '"}'), 0, now);
ELSE
INSERT INTO notifications (user_id, subject, action_id, data, seen, activates)
VALUES
(NEW.user_id, NEW.event_id, 2, '{"period":"tomorrow"}', 0, DATE(start - INTERVAL 1 DAY)),
(NEW.user_id, NEW.event_id, 2, '{"period":"in one hour"}', 0, start - INTERVAL 1 HOUR);
END IF;
END IF;
END
它的目的是在用户提交他将要参加活动时创建有关开始活动的通知。如果事件不是今天,触发器会起作用,但如果事件是今天,我会收到此消息
列数据不能为NULL
列数据在表notifications 中。如果事件设置为今天开始,我得到的列数据不能为 NULL,如果事件在未来发生,比如明天,我会得到准确的消息。
非常感谢任何帮助!
【问题讨论】:
-
如果@text 为null,则@hours 必须为null - sql null 具有传染性,这可能意味着
start在您实际设置start的第一个查询中为null,其中@987654325 @ 是基于的。 -
@MarcB 我刚刚检查过,通过将
INSERT语句中的@text分别替换为start和now,我确定start等于2014-11-21 20:00:00和@987654332 @ 在测试时等于“2014-11-21 19:29:31”。出于某种原因,HOUR(start - now)返回 NULL,我不明白.. -
我不确定
start - now的数据类型应该是什么,但我对文档的快速阅读表明可能是一些数字类型。在任何情况下,它都不应该是DATE、TIME或DATETIME。HOUR()函数似乎不太可能对此有用。 -
不应该是
= HOUR(start) - HOUR(now)吗? -
datetime-datetime将返回某种浮点数。 hour(float) 应该只返回1。在应用 hour() 之前将减法的结果存储在某处。