【发布时间】:2018-02-08 10:22:39
【问题描述】:
在我的数据库中,当我尝试运行以下查询时,我有一个 varchar2 格式的日期列,我收到 ORA - 01847 错误。
SELECT NVL(SUM(TOTAL_QOH),0)
FROM V_STOCK_ENQUIRY
WHERE LOCATION_ID = 82
AND TO_DATE(EXPIRY_DATE, 'DD-MM-YYYY')>= TO_DATE('01-11-2017', 'DD-MM-YYYY')
AND TO_DATE(EXPIRY_DATE, 'DD-MM-YYYY')<= TO_DATE('01-11-2017', 'DD-MM-YYYY')
但是当我尝试运行相同的查询但只取 TOTAL_QOH 而不是总和时,我得到了正确的结果。谁能帮我解决这个问题。
【问题讨论】:
-
不应该是
select sum(nvl(TOTAL_QOH, 0))吗? -
这与
mysql和sql-server有什么关系?` 了解您的 DBMS.. 选择正确的! -
@Abra 至少在理论上,在最后应用一次
nvl()比对每一行执行并添加所有零更有效。 -
我的猜测是您的数据中某处的值无效,并且您的 IDE(PL/SQL Developer 等)在第一个屏幕后暂停,因此除非您应用聚合函数,否则不会出现错误要求数据库处理所有值。
-
如果是这样,那么当我尝试直接获取该列时它是如何工作的? 通常,像 PL/SQL Developer、SQL Developer、TOAD 等 IDE 不会显示查询中的所有行,而是在第一个屏幕或一些可配置的行数之后暂停。如果您的无效值在第 20000 行,除非您明确地获取至少 20000 行,否则您不会命中它,因为 SQL Developer 或您使用的任何东西在 100 行后暂停。