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

如何用Sequelize校验用户输入时间是否在数据库时间的指定区间内?

Sequelize后端实现会议时间区间校验方案

用户前端已通过moment.js的isBetween方法实现功能:检查用户输入的时间是否处于数据库已有会议时间的前1小时至后2小时区间内。现需在后端使用Sequelize实现相同逻辑,校验指定日期下,用户输入的时间是否与数据库中已存在的会议时间存在该区间重叠。

用户现有代码

后端当前代码

const db = require("../models");
const Meet = db.meet;

checkDuplicateTime = (req, res, next) => {
  Meet.findAll({
      where: {
          tanggal: req.body.date,
          waktu: req.body.time                 
      }
  }).then(time => {
          if(time --- (1000 * 60 * 60) || time +++ (2000 * 60 * 60)) {
              res.status(400).send({
                  message: "Failed! Time already use!!"
              });
              return;
          }
          next();
      });
  });
}

前端实现代码

timedi() {
        const timede = this.dateCheck.filter((item) => {
          return moment(item.dates).isSame(new Date(this.dates), "day")
        }).some((item)=> {
            const format = 'hh:mm:ss'
            const time = moment(this.time, format) // from input user
            const beforeTime = moment(item.time, format).add(-1, 'hours') // from already database 
            const afterTime = moment(item.time, format).add(2, 'hours'); // from already database

            if(time.isBetween(beforeTime, afterTime)) {
                console.log('Ignore')
            } else {
                console.log('Allow')
            }
        })
    },

修正后的Sequelize后端实现

需要引入Sequelize操作符,构造精准的查询条件来匹配时间区间冲突:

const db = require("../models");
const Meet = db.meet;
const { Op } = require("sequelize"); // 引入Sequelize操作符

checkDuplicateTime = async (req, res, next) => {
  try {
    const { date, time } = req.body;
    // 将日期和时间拼接为完整的可计算时间对象
    const userDateTime = new Date(`${date}T${time}`);
    
    // 查询指定日期下,存在时间区间冲突的会议
    const conflictingMeeting = await Meet.findOne({
      where: {
        tanggal: date,
        [Op.and]: [
          // 已有会议时间减1小时后,仍晚于等于用户输入时间
          Sequelize.where(
            Sequelize.fn('DATE_SUB', Sequelize.col('waktu'), Sequelize.literal('INTERVAL 1 HOUR')),
            Op.lte,
            userDateTime
          ),
          // 已有会议时间加2小时后,仍早于等于用户输入时间
          Sequelize.where(
            Sequelize.fn('DATE_ADD', Sequelize.col('waktu'), Sequelize.literal('INTERVAL 2 HOUR')),
            Op.gte,
            userDateTime
          )
        ]
      }
    });

    if (conflictingMeeting) {
      return res.status(400).send({
        message: "Failed! Time falls within the restricted interval of an existing meeting!!"
      });
    }
    next();
  } catch (err) {
    res.status(500).send({ message: err.message });
  }
};

关键逻辑说明

  • 调用数据库原生函数DATE_SUB和DATE_ADD,对应前端对时间的加减操作,直接在数据库层面完成计算,避免数据传输和前端后端时间格式差异问题
  • 通过Op.and组合双条件,确保用户输入时间落在已有会议时间的前1小时到后2小时区间内
  • 使用findOne替代findAll,只要找到一个冲突会议就终止查询,提升性能
  • 增加异步异常捕获,保证接口在出现错误时能正常返回提示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:25