表t1
列c1 varchar 且格式与20130529这种格式相同.
1.直接比较
select * from t1 where c1 <= '20130529';
2.用函数转为date后再比较
select * from t1 where str_to_date(c1, '%Y%m%d') <= str_to_date('20130529', '%Y%m%d');
目前倾向于直接用第一种,因为建了索引,但是怕会出错,所以想请教大家两种写法哪种更好?
这两个写法有各自的优缺点:
select * from t1 where c1 <= '20130529';
这可以获得最高的查询性能。但是,为了避免c1格式在未来有变动导致错误,您也可以考虑:
在开发环境/测试环境中使用DATE函数验证:
select * from t1 where str_to_date(c1, '%Y%m%d') <= str_to_date('20130529', '%Y%m%d');
在确认结果正确性后,再在生产环境中使用直接比较,获得最佳性能。这种方式可以在灵活性和性能之间取得一个平衡。
可以是可以比较的,但是结果可能会有偏差的,个人建议你使用第二种
可以,但是字符串比较速度会慢
两种都不是什么好办法
数据库里字段类型就应该直接用date而不是varchar
date类型不仅可以保证你输入的时候必定是个有效的日期,而且它是数值类型,存储空间也有优势
比较的时候也快
对于问题中的日期比较,建议将日期字符串转换为日期格式后再进行比较,避免出现错误。可以使用SimpleDateFormat类进行日期格式转换,具体步骤如下:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = sdf.parse("20130529");
具体实现可以参考以下代码:
// 初始化SimpleDateFormat对象,指定日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 从数据库获取日期字符串 String dateStr = "20130528";
// 将日期字符串转换为Date对象 Date date1 = sdf.parse(dateStr);
// 创建另一个日期字符串 String dateStr2 = "20130601";
// 将日期字符串转换为Date对象 Date date2 = sdf.parse(dateStr2);
// 比较两个日期对象 if(date1.before(date2)){ System.out.println(dateStr + " is before " + dateStr2); } else { System.out.println(dateStr + " is not before " + dateStr2); }
代码执行结果为"20130528 is before 20130601",说明比较成功。