数据库查找某段时间范围内的数据,时间用3个int型字段表示年月日

冷开水 发布于 2015/11/13 00:23
阅读 580
收藏 0
@Query("select  xx from table c where c.year>=?1 and c.year<=?2 and c.month>=?3 and c.month<=?4 and c.date>=?5 and c.date<=?6“)
findxxx( int startYear, int endYear, int startMonth, int endMonth, int startDate, int endDate);

业务要求根据传入的startDate 和 endDate,找出在这两个时间内的数据,但数据库是用3个int型字段分别表示年月日的。所以我就写成上面所示的SQL去查询数据库,经过测试发现了一个问题,如果一条数据他的年=2015,月=3,日=15.      输入startDate=2014-06-20,endDate=2016-05-25测试,发现查询不到这条数据,因为startDate的月份是06 ,数据库的数据月份是3 ,导致第3个条件不成立。

c.month>=?3

但实际看时间2015年的数据应该都能查找出来。

求助各位大神这个查询语句应该怎么写才能避免这个错误?

PS:实际传入的两个时间是date型,只是被我转成3个int。



加载中
0
Kinegratii
Kinegratii

也吐糟下表设计。

之前在做月度记录表时也用过类似的设计,不过只有年月两个字段。



(c.year > startYear || (c.year=startYear && c.month > startMonth) || (c.year=startYear && c.month=startMonth && c.date > startDate))

&& 

(c.year < endYear || (c.year=endYear && c.month < endMonth) || (c.year=endYear && c.month=endMonth && c.date < endDate))


最外层分别是大于起始日期和小于终止日期的与运算。


里面的,比如大于2014-06-20的日期,有三种:

1) 年份比它大的 2)相同年份月份比它大的 3)年月相同,日期比它大的

后一个同理。

冷开水
冷开水
非常感谢,帮了大忙
0
zigzagroad
zigzagroad
谁设计的数据库表结构,用棍子使劲打,准没打错。设计成一个int字段就可以了。
乌龟壳
乌龟壳
回复 @zigzagroad : where里不用year,month那些过滤,而是选取某年最早一天或者某月最早一天等边界天来过滤,分组的时候才用year,month。
zigzagroad
zigzagroad
查询条件用了函数就不走索引了
乌龟壳
乌龟壳
回复 @冷开水 : 一个转换函数的事
冷开水
冷开水
设计成int 是为了好统计年月日的一些记录
乌龟壳
乌龟壳
回复 @徐清凯 : 时间戳本质是int,不过用date类型方便操作
下一页
0
冷开水
冷开水
现在就是收拾别人的摊子
0
xuqingkai
xuqingkai
数据库结构设计完全错误,,,,这种结构没办法实现你的要求!
0
疾风_小子
spring data jpa.. 我也在用
返回顶部
顶部