You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite插入触发器计算Duration始终为7的问题排查

触发器计算Duration始终返回7的问题排查与解决

我来帮你捋清楚这个问题——你的触发器逻辑里有个很容易忽略的错误,才会导致每次插入后Duration都固定是7,而单独跑查询却能得到正确结果。

问题根源分析

你当前的触发器代码里犯了两个关键错误:

  1. 错误地更新了整个表:你用UPDATE StudentData set duration = ...语句,这会修改表中所有行的Duration字段,而不是只给你正要插入的新行赋值。
  2. 子查询没有限定范围:子查询select cast( (julianday(enddatetime) - julianday(startdatetime) ) *24 * 60 *60 as integer) from StudentData没有指定WHERE条件,会返回表中所有行的计算结果。SQLite在这种场景下会默认取第一行的结果,如果你的表之前恰好有一行计算后的值是7,那所有行都会被改成这个数。

而你单独执行查询时,应该是加了WHERE条件限定了某一行,所以能得到正确的时间差,这就和触发器里的逻辑形成了差异。

修正后的触发器代码

BEFORE INSERT触发器的正确用法是直接通过NEW关键字操作要插入的新行,不需要执行UPDATE语句。修改后的代码如下:

CREATE TRIGGER duration_trigger BEFORE INSERT ON StudentData
BEGIN
  SET NEW.duration = CAST( (julianday(NEW.enddatetime) - julianday(NEW.startdatetime)) * 24 * 60 * 60 AS INTEGER);
END;

代码解释

  • NEW.enddatetime和NEW.startdatetime直接引用当前要插入的新行的时间字段,确保计算的是这一行的时间差。
  • 直接给NEW.duration赋值,在插入操作执行前就把正确的秒数填入新行的Duration字段,既不会影响表中其他已存在的行,也能保证结果准确。

你可以删掉原来的触发器,创建这个新的触发器再测试,应该就能得到正确的Duration值了。

内容的提问来源于stack exchange,提问作者iosappdevguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:24