Oracle存储过程中拼接时间查询数据未查询到?
在一个项目中用一个存储过程来查询的时候有两个时间参数传入,查询的内容大概是这个样子
v_sql1:=v_sql1||' and logtime between '''||t_starttime||''' and '''||t_endtime||''' ;
其中t_starttime和t_endtime是传入的参数
在执行查询的时候,执行的数字和总的数字总是对不上,查询出来的合计是820,但在数据库中可以查询出来的数字却是830.相差了10个。然而在plsql中调用统计函数来测试,查出来的却是830,和默认的是相同的。所以考虑在存储过程中调用统计函数的参数出现了问题。
在plsql中跟踪了一下存储过程中字符串拼接,最后定位到了时间上面。也就是类是于上面的那段代码。
假设我传入的参数为2013-01-01 00:00:01 和2013-01-10 23:59:59最后字符串转换出来的是'01-1月 -13’和'10-1月 –13’后面的时分秒被丢失掉了,这个字符串转换的方式是有oralce设置转换的,在普通的查询中,是没有任何问题的。但是在存储过程中需要做字符串拼接就出现问题了。后面的时分秒省略后,拼接出来的字符串就是这样
v_sql1:=v_sql1||' and logtime between '01-1月-13' and '10-1月-13' ;
但是我们想要得到的是这样
v_sql1:=v_sql1||' and logtime between ’2013-01-01 00:00:01’ and ’2013-01-10 00:00:01’;
当然上面那个格式是不正确的,和oracle里面默认的字符格式不一致,执行sql会被报出字符串格式错误的问题。
在做直接转换的时候由于between是两边都包含在内的,这样我们最后查询的数据是2013-01-01 00:00:00 到2013-01-10 00:00:00
这和我们最初希望得到的查询数据差了一天的数据。所以做时间拼接的时候要注意格式的问题,在做转换的时候丢失了精度。
那么如何来解决这种精度错误带来的问题呢,其实这里只需要使用代替变量就可以解决
字符串变为
v_sql1:=v_sql1||' and zcsj between :1 and :2 ';
执行的时候