• 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;
  • 相关阅读:
    PHP变量的使用
    php基础知识一
    PHP之 xampp 安装环境
    自动化测试框架selenium+java+TestNG——配置篇
    代码规范体会篇
    寒假作业2(两篇随笔)
    寒假作业二之自学计划
    寒假作业第二篇随笔(A+B)
    寒假随笔(开启程序设计大佬模式)
    页面即时消息提醒的实现
  • 原文地址:https://www.cnblogs.com/ac1985482/p/3129151.html
Copyright © 2020-2023  润新知