>我有以下预言机查询,它抛出了异常,下面是查询
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月4日的所有日期的数据 6月5日,我也在使用cast是否有效或任何其他更好的选择
强制转换日期依赖于 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';
顺便说一下,您应该真正开始使用现代联接语法,使用*
通常不是一个好主意 - 最好从每个表中列出您实际需要的列。首先,连接条件中使用的列将显示两次,每个连接表中一个。
从问题来看,不清楚created_at字段的日期格式是什么。此问题很可能是由于您比较的日期格式错误。
以下是ORA-01830错误的有用链接。
https://www.techonthenet.com/oracle/errors/ora01830.php
您必须将CAST
替换为TO_DATE
:
to_date('3-JUN-18 00:00:00','DD-MON-RR HH24:MI:SS')
我建议对日期字符串使用 ISO-8601 国际日期格式:
to_date('2018-06-03 00:00:00','yyyy-mm-dd hh24:mi:ss')