получение исключения в оракулярном запросе с контекстной обработкой - PullRequest
0 голосов
/ 23 октября 2018

У меня есть приведенный ниже запрос оракула, который выдает исключение, ниже приведен запрос

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:

Теперь, пожалуйста, сообщите мне, как я могу исправитьэтот запрос выше, так что он приносит данные за все дни, для 3 июня, 4 июня и 5 июня, также я использую приведение, эффективен ли он или любой другой лучший вариант есть

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Приведение даты зависит от параметров сеанса 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';

Кстати, вам действительно следует начать использовать современный синтаксис объединения, и обычно не рекомендуется использовать * - лучше перечислить столбцы, которые вам действительно нужны из каждой таблицы.Для начала столбцы, используемые в условиях соединения, будут показаны дважды, по одному из каждой объединенной таблицы.

0 голосов
/ 23 октября 2018

Вы должны заменить 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')
0 голосов
/ 23 октября 2018

Из вопроса непонятно, в каком формате находится поле create_at.Скорее всего, эта проблема может быть связана с неправильным форматом даты, который вы сравниваете.

Ниже приведена полезная ссылка для ошибки ORA-01830.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...