oracle sql developer(4.0.0.12)返回错误的日期

时间:2015-03-10 09:04:39

标签: sql oracle group-by having

我的查询似乎返回了错误的结果,我不确定原因。我还没有排除SQL实际上正在做其他事情的可能性,然后我期望/希望它做什么,因为我现在还没有使用过SQL。

我在这里发布,因为我有时会为什么会错误地返回错误的结果。

错误在MIN(FIRM.account_recharge.X__INSDATE)(或至少是我注意到的那些)

SELECT
 FIRM.customer.CUSTOMER_ID,
 FIRM.customer.CORPORATION,
 FIRM.customer.CUSTOMER_NAME_PREFIX,
 FIRM.customer.CUSTOMER_NAME,
 FIRM.account.ACCOUNT_TYPE,
 FIRM.account.ACCOUNT_TYPE,
 FIRM.customer.LANGUAGE,
 FIRM.customer.VALIDATED,
 FIRM.account.X__INSDATE,
 SUM(FIRM.account_recharge.GROSS_VALUE) SUM_FELTOLTESEK,
 MIN(FIRM.account_recharge.X__INSDATE),                                           
 INNER JOIN FIRM.account
 ON FIRM.customer.CUSTOMER_ID = FIRM.account.CUSTOMER
 INNER JOIN FIRM.customer_address
 ON FIRM.account.CUSTOMER = FIRM.customer_address.CUSTOMER          
 INNER JOIN FIRM.account_recharge
 ON FIRM.account.ACCOUNT_ID = FIRM.account_recharge.ACCOUNT         
 GROUP BY FIRM.customer.CUSTOMER_ID,
 FIRM.account.X_INSDATE,
 FIRM.customer.CORPORATION,
 etc,etc
 HAVING MIN(FIRM.account_recharge.X__INSDATE) BETWEEN to_date('2014-JAN. -01','YYYY-MON-DD') AND to_date('2014-DEC. -31', 'YYYY-MON-DD');

此代码应返回与我们的客户相关的信息,他们的总帐户'充电' /'补充'支付'抱歉不知道在这里使用什么词。并且他们的第一笔付款/钱在2014年上传到他们的帐户。但有时候,返回值似乎只是忽略了我们的客户第一次付钱,并显示第二或第三个日期。 (我的随机手动检查返回了大约1/10的返回值是错误的。)

我们的客户可以拥有更多与他相关联的账户。我正在使用Oracle SQL开发人员(4.0.0.12),请询问您是否想了解有关此pickle的任何其他内容。

否则它似乎工作得很好,但如果你有任何其他调音技巧,我会很高兴听到它们。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

  

在'14 -JAN之间有MIN(FIRM.account_recharge.X_INSDATE)。 -01'和'14 -DEC。 -31'

这绝对不正确。你正在比较日期。因此,您必须使用 TO_DATE 和正确的格式掩码将字符串文字明确转换为日期。

例如,

HAVING MIN(FIRM.account_recharge.X_INSDATE) 
   BETWEEN to_date('2014-JAN-01','YYYY-MON-DD') 
   AND     to_date('2014-DEC-31', 'YYYY-MON-DD')

另外,请勿使用 YY 来表示年份。您不必再次重新发明 Y2K 错误。始终使用 YYYY 格式一年。否则,如果您坚持使用年度的YY值,则使用RR格式。但是,我坚持认为,一年中总是使用YYYY格式。