Recebi uma instrução SELECT que está sendo executada em um Crystal Report para investigar um problema de dados, mas quando tento executá-lo no banco de dados, recebo o erro:
ORA-01861: literal não corresponde à string de formato 01861. 00000 - "literal não corresponde à string de formato" *Causa: Os literais na entrada devem ter o mesmo comprimento que os literais na string de formato (com exceção do espaço em branco inicial). Se o modificador "FX" foi ativado, o literal deve corresponder exatamente, sem espaço em branco extra. *Ação: Corrija a string de formato para corresponder ao literal.
Eu acho que tem a ver com as comparações de datas, mas não tenho certeza do que está errado. Eu não sei nada sobre oracle e, como a mensagem de erro não especifica a linha em que o erro está, estou apenas supondo qual pode ser o problema. Alguém pode me indicar o que está causando esse problema?
SELECT ACTDET.GROSS_VOLUME,
ACTDET.NET_VOLUME,
ACTIVITY.SHIPPER_ID,
ACTIVITY.ACTIVITY_START_DATE,
SHIPPER.NAME_1,
TANK.TANK_PRODUCT_CODE,
PRODUCT.DESCRIPTION_2,
SITE.NAME_1,
SITE.NAME_2
FROM G3USER.ACTIVITY ACTIVITY,
G3USER.ACTDET ACTDET,
G3USER.SHIPPER SHIPPER,
G3USER.TANK TANK,
G3USER.SITE SITE,
G3USER.PRODUCT PRODUCT
WHERE ((ACTIVITY.TERMINAL_ID=ACTDET.TERMINAL_ID) AND (ACTIVITY.BOL_NUMBER=ACTDET.BOL_NUMBER))
AND ((ACTIVITY.TERMINAL_ID=SHIPPER.TERMINAL_ID) AND (ACTIVITY.SHIPPER_ID=SHIPPER.SHIPPER_ID))
AND ((ACTDET.TERMINAL_ID=TANK.TERMINAL_ID) AND (ACTDET.TANK_ID=TANK.TANK_ID))
AND (ACTDET.TERMINAL_ID=SITE.TERMINAL_ID)
AND ((TANK.TERMINAL_ID=PRODUCT.TERMINAL_ID AND (TANK.TANK_PRODUCT_CODE=PRODUCT.PRODUCT_CODE))
AND (ACTIVITY.ACTIVITY_START_DATE >= '2014-02-05 00:00:00') AND (ACTIVITY.ACTIVITY_START_DATE < '2014-02-06 00:00:00'));
O Oracle não entende as strings de formato de data literal, pois elas não estão no mesmo formato para o qual seu cliente está configurado. Você precisa usar a
TO_DATE
função para informar ao Oracle o formato da string de data com a qual está apresentando, assim:Você também pode representar suas datas usando a sintaxe ANSI (já que elas não têm componente de tempo):
Uma instalação padrão do Oracle Database define o formato DATE padrão como DD-MON-YYYY.
E você estava usando um formato diferente em sua consulta sql. Você pode usar a função to_date ou simplesmente alterar o modelo de formato de data para DD-MON-YYYY. .
Clique aqui para ver a referência do oráculo
Se
ACTIVITY.ACTIVITY_START_DATE
tiver o tipo de dados DATE, a comparação deve ficar assim (você nem sempre pode comparar datas com stings no banco de dados Oracle):...ACTIVITY.ACTIVITY_START_DATE >= TO_DATE('2014-02-05 00:00:00','YYYY-MM-DD HH24:MI:SS')