在Oracle查询中获取上下文相关日期处理异常

时间:2018-10-23 17:06:45

标签: oracle

我有下面的oracle查询抛出异常,下面是查询

SELECT GFT.*, PA.*,P.* FROM GFT_DATA GFT, CONTACT_TOKEN CT, EDUCT_ATTRIBUTE PA,
PERSON P WHERE GFT.PERSON_ID = 122445220 AND GFT.TO_CONTACT_TOKEN_ID = CT.CONTACT_TOKEN_ID 
AND GFT.EDUCT_ATTRIBUTE_ID = PA.EDUCT_ATTRIBUTE_ID AND GFT.PERSON_ID = P.PERSON_ID
AND GFT.CREATED_ON  > CAST ('3-JUN-18 00:00:00' AS DATE) 
AND GFT.CREATED_ON <= CAST ('5-JUN-18 23:59:59' AS DATE);

作为

出现的异常
ORA-01830: date format picture ends before converting entire input string
01830. 00000 -  "date format picture ends before converting entire input string"
*Cause:    
*Action:

现在,请告诉我如何纠正上述查询,以使它带来6月3日,6月4日和 6月5日,我是否也在使用演员表,是否有效?或者还有其他更好的选择

3 个答案:

答案 0 :(得分:1)

投射日期取决于您的NLS会话参数,并且当前它们与您提供的字符串格式不匹配。作为演示:

alter session set nls_date_format = 'DD-MON-RR';

select CAST ('3-JUN-18 00:00:00' AS DATE) from dual;

ORA-01830: date format picture ends before converting entire input string

alter session set nls_date_format = 'DD-MON-RR HH24:MI:SS';

select CAST ('3-JUN-18 00:00:00' AS DATE) from dual;

CAST('3-JUN-1800:0
------------------
03-JUN-18 00:00:00

最好使用to_date()函数来完全避免该问题,该函数允许您指定字符串格式:

AND GFT.CREATED_ON  > TO_DATE('3-JUN-18 00:00:00', 'DD-MON-RR HH24:MI:SS', 'NLS_DATE_LANGUAGE=ENGLISH') 
AND GFT.CREATED_ON <= TO_DATE('5-JUN-18 23:59:59', 'DD-MON-RR HH24:MI:SS', 'NLS_DATE_LANGUAGE=ENGLISH');

由于您使用的是月份名称,因此我加入了可选的第三个参数来指定日期语言。如果可以,请更改字符串格式以使用月份数字和4位数字的年份:

AND GFT.CREATED_ON  > TO_DATE('03/06/2018 00:00:00', 'DD/MM/YYYY HH24:MI:SS') 
AND GFT.CREATED_ON <= TO_DATE('05/06/2018 23:59:59', 'DD/MM/YYYY HH24:MI:SS');

通常,将范围设置为以下也会更好:

AND GFT.CREATED_ON >= TO_DATE('03/06/2018 00:00:00', 'DD/MM/YYYY HH24:MI:SS') 
AND GFT.CREATED_ON <  TO_DATE('06/06/2018 00:00:00', 'DD/MM/YYYY HH24:MI:SS');

包括从3号正午(由于>而排除了您的版本,因此您只能看到00:00:01的东西)直到6号正午(但不包括)的所有内容。

不需要真正指定时间,因为它默认为午夜;所以您可以将其简化为:

AND GFT.CREATED_ON >= TO_DATE('03/06/2018', 'DD/MM/YYYY') 
AND GFT.CREATED_ON <  TO_DATE('06/06/2018', 'DD/MM/YYYY');

,并且可以使用明确的日期文字进一步简化它:

AND GFT.CREATED_ON >= DATE '2018-06-03' 
AND GFT.CREATED_ON <  DATE '2018-06-06';

顺便说一句,您应该真正开始使用现代的连接语法,并且使用*通常不是一个好主意-最好从每个表中列出实际需要的列。首先,将在连接条件中使用的列显示两次,每个连接表中的一个。

答案 1 :(得分:0)

从问题上,不清楚created_at字段的日期格式是什么。此问题很可能是由于您比较的日期格式不正确。

以下是ORA-01830错误的有用链接。

https://www.techonthenet.com/oracle/errors/ora01830.php

答案 2 :(得分:0)

您必须将CAST替换为TO_DATE

to_date('3-JUN-18 00:00:00','DD-MON-RR HH24:MI:SS')  

我建议对日期字符串使用ISO-8601 International date format

to_date('2018-06-03 00:00:00','yyyy-mm-dd hh24:mi:ss')