2016-04-28 3 views
0

мне нужно добавить дней к дате в HANA хранимой процедуры, но я получаю сообщение об ошибкенужно добавить количество дней до настоящего времени в SAP Hana хранимая процедура

Ошибка при анализе ДАТА/ВРЕМЯ

v_end_date_plus: = add_days (TO_DATE ('|| p_end_date ||', 'YYYY-MM-DD'), 90)

где p_end_date является DATE и я передаю это значение в качестве параметра при вызове хранимой процедуры.

v_end_date_plus является переменной DATE.

, но я получаю ошибку во время работы.

Есть ли какой-либо другой способ или что я делаю не так в нем?

+0

Необходимо отправить сообщение об ошибке. – Hannobo

ответ

-1

p_end_date должно быть полем varchar или соответствующим строковым литералом, используемым в вашей технологии. Он не должен быть заключен в кавычки.

v_end_date_plus := add_days (TO_DATE(p_end_date , 'YYYY-MM-DD'), 90) 

ОБЪЯСНЕНИЕ ИСПОЛЬЗОВАНИЕ ORACLE КАК ССЫЛКА:

В базе данных Oracle, формат даты по умолчанию дд-ПН-РР или дд-ПН-YYYY.

Итак, если я использую правильный формат даты для переменной p_end_date, я могу получить результат. enter image description here

Однако, если я отклоняюсь от этого формата по умолчанию, моя попытка будет ошибочной.

enter image description here

Так что, если я хочу, чтобы гибкость переопределить p_end_date в формате по своему выбору, а не в соответствии с настройками по умолчанию, он должен быть строковый литерал. (VARCHAR в Oracle).

EDIT:

Суть этого ответа было только предположить, что переменная должна быть передана как VARCHAR. Заимствуя предложение Ларса Br в поле ниже, чтобы изменить синтаксис переменной p_end_date в:

v_end_date_plus := add_days (TO_DATE(:p_end_date , 'YYYY-MM-DD'), 90) 
+0

Oracle и SAP HANA очень разные, когда речь заходит о языке скриптов. Объяснение по аналогии в этом случае не работает. –

+0

@LarsBr., Ok, point отметил. Неужели мы уверены, что эта расширенная аналогия не будет работать в этом случае? Быстрый просмотр показал мне, что подобные синтаксисы существуют в HANA. –

+0

@ user4836066, если вы пробовали и мое решение не сработало, напишите здесь. Затем я удалю ответ. –

1

Даже если вы не после того, что ошибка, которую вы получите, я думаю, что проблема в вашем коде как вы ссылки переменную ввода.

v_end_date_plus := add_days (:p_end_date , 90); 

С двоеточие (:) перед параметром вы должны быть в состоянии использовать его без необходимости, чтобы бросить его в другой тип данных.

0

@LarsBr. правильно, что вам нужен двоеточие (:) для ссылки на переменную, и если это действительно тип DATE, вам не нужно снова конвертировать TO_DATE.

Но, кроме того, в вашем примере у вас есть смесь с кавычками и конкатенацией, что заставляет меня думать, что вы действительно хотите построить некоторую строку символов, используя p_end_date.Для этого потребуется преобразование в дату первого:

p_end_date := '2016-05-03'; -- for example 
v_end_date_plus := add_days(TO_DATE(:p_end_date , 'YYYY-MM-DD'), 90); 

Часть ' || p_end_date || ' в вашем примере также выглядит как весь код был на самом деле часть строки, которая будет использоваться в EXEC или аналогичный. Если это так, вам нужно иметь экранированные одиночные кавычки для обоих параметров, например.

exec 'v_end_date_plus := add_days(TO_DATE(''' || :p_end_date || ''', ''YYYY-MM-DD''), 90)';