基于输入日期,用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
相关产品推荐
相关产品推荐

