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

Spring中比较数据时间与当前时间后如何正确更新指定行状态

根因定位

你遇到的问题有两个核心错误点:

  • MyBatis更新语句注释了WHERE SMS_ID = #{smsId}过滤条件,不带WHERE的UPDATE语句会直接修改表内所有行,这是全表被更新的直接原因。
  • 业务逻辑存在两处错误:
    1. 用dd-MM-yyyy HH:mm格式的字符串做compareTo比较逻辑完全错误:字符串比较是按字符逐位对比,比如01-10-2024会被判定为小于02-09-2024,但实际10月的日期晚于9月,时间比较结果完全不可信。
    2. 没有做时间比较的分支判断,无论时间大小都调用同一个更新逻辑,无法按预期设置sent/waiting两种状态。
修复方案

1. 修复MyBatis更新SQL

首先恢复WHERE条件,确保每次更新仅作用于指定单条记录:

<!-- 示例:对应insertOrUpdateStatusOfSendSMS方法的SQL -->
<update id="insertOrUpdateStatusOfSendSMS">
    UPDATE sms_send_record
    SET send_status = #{sendStatus}
    WHERE SMS_ID = #{smsId} <!-- 取消注释,必须保留该行 -->
</update>

注意替换表名、状态字段名为你项目实际的字段名。

2. 修正时间比较逻辑

不要将时间转为字符串比较,直接用时间类型本身的对比方法:

Java 8+ 版本(推荐)

将scheduled字段映射为LocalDateTime类型,直接用自带的时间对比方法:

// 获取当前系统时间
LocalDateTime currentTime = LocalDateTime.now();
// 查询待处理短信列表
List<SmsRecord> smsList = smsService.selectListSMSBranding();
for (SmsRecord sms : smsList) {
    LocalDateTime scheduledTime = sms.getScheduled();
    // 分支判断设置对应状态
    String targetStatus = currentTime.isAfter(scheduledTime) ? "sent" : "waiting";
    // 调用更新方法,传入短信ID和目标状态
    smsService.insertOrUpdateStatusOfSendSMS(sms.getSmsId(), targetStatus);
}

旧Java版本(使用Date)

通过时间戳对比:

Date currentTime = new Date();
List<SmsRecord> smsList = smsService.selectListSMSBranding();
for (SmsRecord sms : smsList) {
    String targetStatus = currentTime.getTime() > sms.getScheduled().getTime() ? "sent" : "waiting";
    smsService.insertOrUpdateStatusOfSendSMS(sms.getSmsId(), targetStatus);
}

3. 可选优化:批量SQL更新(性能更高)

如果数据量较大,逐条更新IO开销高,可以直接用单条SQL在数据库层完成批量处理,无需查询全表遍历:

<update id="batchUpdateSmsSendStatus">
    UPDATE sms_send_record
    SET send_status = CASE
        WHEN scheduled < NOW() THEN 'sent'
        ELSE 'waiting'
    END
    <!-- 建议加过滤条件,仅处理未完成的记录,避免重复更新历史数据 -->
    WHERE send_status IN ('init', 'waiting')
</update>

直接调用这个方法即可完成全量状态更新,性能远高于遍历逐条更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 11:45:03