首先是踩了坑花了2小时的教训才学聪明了,最好的解决方案是 将对象字段和数据库字段都设置 Date类型,这样在mybatis中可以直接比较。
当时由于idea上xml的检测机制问题,字段的重复比对需要添加注释,不然报SQl dialect no configured的error,当然你也可以把IDEA设置中File -> setting 搜索inspections,再搜索sql,找到SQL dialect detection去掉勾就行。建议加注释,规范自己。
关于时间的保存基本分为4种
假设该时间字段名称为 create_date
刚开始我的做法是图方便,对象create_date字段设为 String,数据库create_date字段设为 varchar2
我们通常在前端使用时间插件传入值,这里我用的是jquery datepicker,注意把时间格式设置成 yy-mm-dd,这种格式在后台进行再次转换不会报错,不然 默认的‘mm/dd/yy’的格式会因为格式不匹配,用 simpleFormat.parse方法转换有问题;
这里由于前端传过来的是字符串,是需要后台进行转换成Date类型的
@ResponseBody
@PostMapping("/records")
public Msg findRecords(@RequestParam(value="pn",defaultValue="1") Integer pn,
@RequestParam("startdate") String startdate,
@RequestParam("enddate") String enddate) throws Exception{
System.out.println("startdate : " + startdate + "enddate :" + enddate);
PageHelper.startPage(pn,5);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List list =
recordService.getRecordByDate(sdf.parse(startdate),sdf.parse(enddate));
PageInfo page = new PageInfo(list,5);
return Msg.success().add("pageInfo", page);
}
所以需要前端传时间的参数值是 需要在 前端时间插件 中设置成 常用的时间格式
$(".choosedate").datepicker({dateFormat: "yy-mm-dd"});
将其转换成固定格式的Date类型对象字段就可以直接进行比较了,如果是固定格式的字符串怎么办呢?
= TO_DATE( #{arg0,jdbcType=DATE}, 'yyyy-mm-dd hh24:mi:ss')]]>
用to_date的转换吧,但是如果本身传入的字段就是date类型的话就会报错了
ORACLE官方文档
Propose
TO_DATE
converts char
of CHAR
, VARCHAR2
, NCHAR
, or NVARCHAR2
data type to a value of DATE
data type.
它是将一个 字符串 类型的数据转换成 Date 类型,其他类型的转化会报不匹配的错误 ,平时看的比较多的是 to_date(sysdate,'yyyy-mm-dd') 就以为,to_date函数是将date类型的数据转换指定格式的date了,看来还是得系统的看看官方文档呀。
对了,还有 js给前端时间插件赋值格式的问题
$(function(){
var nowday = new Date().format("yyyy-MM-dd");
$("#startdate").val(nowday);
$("#enddate").val(nowday);
});
Date.prototype.format =function(format)
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)){
console.log(RegExp.$1.length);
format=format.replace(RegExp.$1,(this.getFullYear()+"").substr(4- RegExp.$1.length));
}
for(var k in o){
if(new RegExp("("+ k +")").test(format)){
format = format.replace(RegExp.$1,RegExp.$1.length==1? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
}