zoukankan      html  css  js  c++  java
  • 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 ';

    执行的时候

      Execute Immediate v_sql1 using t_start,t_end;
  • 相关阅读:
    spring与springmvc父子容器
    spring容器BeanFactory简单例子
    spring整体架构
    css中".",",",“~”和“>”符号的意义
    CSS中的块级元素与行级元素
    java反射和动态代理
    thymeleaf的fragment例子
    编写一个简单的 JDBC 程序
    http://localhost/ 或 http://127.0.0.1/ 报错:HTTP 404 的解决办法
    教你如何清除 MyEclipse/Eclipse 中 Web Browser 和 Switch Workspace 的历史记录
  • 原文地址:https://www.cnblogs.com/ac1985482/p/3129151.html
Copyright © 2011-2022 走看看