根据日期和时间范围选择行

时间:2017-07-25 04:10:51

标签: sql-server spring hibernate jpa jodatime

我正在查询基于两列日期和时间的表来返回行:
tx_creation_date [date]tx_creation_time [time(7)]

使用以下查询语句:

public interface PurchaseRepository extends PagingAndSortingRepository<Purchase, BigDecimal> { 

    @Query(value = "select p from Purchase p where (p.txCreationDate >= 
    :startDate and p.txCreationTime >= :startTime) and (p.txCreationDate <= :endDate and p.txCreationTime <= :endTime)")  
    public List<Purchase> findAllTxByTimestampRange(@Param(startDate) LocalDate startDate,  
    @Param(startTime) LocalTime startTime, @Param(endDate) LocaleDate endDate,  
    @Param(endTime) LocalTime endTime);  

    other queries...  
}

以下是Purchase类的片段:

@Entity  
@Table(name = "po_log")  
public class Purchase implements Serializable {  
    private static final long serialVersionUID = -1L;  

    @Id  
    @Column(name = "po_number")
    private BigDecimal poNumber;  

    private String type;  

    @Column(name = "tx_creation_date")  
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate")  
    private LocalDate txCreationDate;  

    @Column(name = "tx_creation_time")
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersitentLocalTime")  
    private LocalTime txCreationTime; 

    ..  
    .. 

    getters and setters  

}  

执行后,我收到以下错误消息:

  

数据类型datetime和time在大于或等于运算符

时不兼容

我尝试了一些没有成功的技巧:

  1. 在连接属性中设置此sendTimeAsDateTime=false
  2. 使用cast (txCreationTime as time)convert
  3. 使用cast将日期和时间连接为datetime
  4. 非常感谢任何帮助。

    旁注:选择包含日期范围的行只会产生成功。因此问题确实存在于时间上。

    我当前的设置

    • Spring annotations
    • Hibernate 4
    • Jadira用于用户类型,Joda用于LocalDate和LocalTime
    • SQL Server 2014
    • 来自用户的localDate格式化为yyyyMMdd
    • 来自用户的localTime格式化为HHmmssSSS

1 个答案:

答案 0 :(得分:0)

如果您使用jtds驱动程序 - 尝试使用本机microsft JDBC driver - 它实现了JDBC 4,并且应该随着时间的推移正常工作。

或者,您可以将您的实体中的时间列映射为String,并在查询中设置参数new SimpleDateFormat("HH:mm:ss.SSS")