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

基于输入日期,用Spring Data JPA查询SQL Server过去4周同周几数据

Spring Data JPA 实现指定日期过去4周同周几记录查询

实现方案(基于SQL Server原生SQL)

直接在Spring Data JPA的Repository接口中使用@Query注解编写原生SQL,将原SQL中的GETDATE()替换为传入的日期参数即可,以下是具体代码:

1. 定义Repository接口(推荐使用LocalDate类型参数)

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.time.LocalDate;
import java.util.List;

// 替换YourEntity为你的实体类,Long为实体主键类型
public interface YourEntityRepository extends CrudRepository<YourEntity, Long> {

    @Query(value = "SELECT * FROM [table] " +
            "WHERE [DATE] >= DATEADD(DAY, -21, CAST(:inputDate AS DATE)) " +
            "AND Dept = 979 " +
            "AND DATEPART(WEEKDAY, [DATE]) = DATEPART(WEEKDAY, CAST(:inputDate AS DATE)) " +
            "ORDER BY [DATE] DESC",
            nativeQuery = true)
    List<YourEntity> findLastFourWeeksSameWeekday(LocalDate inputDate);
}

2. 若需接收字符串类型日期参数

如果业务场景必须传入字符串格式的日期(如"2023-06-23"),可调整参数类型为String:

@Query(value = "SELECT * FROM [table] " +
        "WHERE [DATE] >= DATEADD(DAY, -21, CAST(:inputDateStr AS DATE)) " +
        "AND Dept = 979 " +
        "AND DATEPART(WEEKDAY, [DATE]) = DATEPART(WEEKDAY, CAST(:inputDateStr AS DATE)) " +
        "ORDER BY [DATE] DESC",
        nativeQuery = true)
List<YourEntity> findLastFourWeeksSameWeekday(String inputDateStr);

关键说明

  • 由于DATE是SQL Server关键字,需用方括号[]包裹字段名和表名(若表名table也是关键字),避免语法错误
  • 使用LocalDate作为参数类型更安全,Spring Data JPA会自动完成类型转换,无需手动处理字符串转日期的逻辑
  • 原SQL中DATEADD(DAY, -21, ...)的逻辑是往前推21天(3周),加上传入日期所在周的同周几日期,刚好得到4条符合要求的记录
  • 保持DATEPART(WEEKDAY)的逻辑与原SQL一致,确保周几的判断规则统一(注意SQL Server默认星期起始日可能为周日,若需调整可在SQL中添加SET DATEFIRST 1指定周一为起始)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:41