РЕЗЮМЕ ВОПРОСА:
Как правильно в HANA SQL или HANA Studio в представлении (вычислении, атрибуте или аналитике) обрабатывать недопустимые данные при попытке привести к дате, чтобы пользователь мог фильтровать данные?
В таблице SAP KONM поле KSTBM
представляет собой десятичный тип данных (15,3 ). Это поле правильно или неправильно, хранит значение даты в формате ГГГГММДДЧЧМ.MSS. (Я пользователь, а не разработчик системы. Почему кто-то хранит дату в десятичном поле вместо поля даты / времени, выходит за рамки этого вопроса.)
Так что допустимые значения, такие как:
- 201703290 (да, 2017 действительный год 03 действительный месяц и 29 действительный день в этом месяце для этого года.)
- 201703301.130 (да, 2017 действительный год 03 действительный месяц и 30 действительный день в этом месяце для этого года, а 11:30 - действительное время)
существуют и могут быть легко преобразованы с помощью to_timestamp
, daydate
или аналогичной функции.
К сожалению, в эту таблицу было внесено несколько неправильных записей, в результате чего данные не могут быть преобразованы в дату и время, например:
- 201702290 (Недействительный день февраля в 2017 году не было 29 дней)
- 201713500 (недействительный месяц 12 месяцев, а не 13)
- 201712312.400 (Неверный час 00: 00: 00-23: 59: 59 нет 24)
- 201712310.060 (Неверная минута 00:60 будет 01:00)
- 201712310.090 (Неверная минута 00:90 будет 01:30)
При использовании функций to_Timestamp
или daydate
для таких недопустимых записей возникает следующая ошибка:
SAP DBTech JDBC: [2048]: ошибка хранилища столбцов: ошибка таблицы поиска: [6860] недопустимое значение даты, времени или отметки времени;
or
[303]: недопустимое значение DATE, TIME или TIMESTAMP:
Я согласен, что это недопустимые даты ... и поэтому я знаю, почему возникает ошибка.
Хотя я хотел бы исправить основную причину, а затем исправить неверные данные; в настоящее время это не вариант. Разные команды, разные ресурсы, разные приоритеты. Так что это в их списке дел, но у меня есть пользователи, которым нужны отчеты WEBI; и поскольку существуют плохие данные ... мне все еще нужно с этим справиться.
Я пытаюсь создать Calculated_view в HANA Studio, который может успешно обрабатывать эти ошибочные даты. Но мне не удалось найти try catch или другой тип обработки исключений, который позволил бы мне в основном установить эти даты на NULL, чтобы пользователь по-прежнему получал другие соответствующие данные и мог видеть, что у них есть некоторые плохие данные в система, которую можно исправить.
В его нынешнем виде с момента возникновения этой ошибки никакие записи не могут быть возвращены из юниверса при запуске отчета WEBI. Я нашел несколько вариантов, которые включают создание таблицы даты / времени со всеми возможными временами .... (надеюсь, вы понимаете, почему я не хочу этого делать) или создание функции (но в ней отсутствуют конкретные указания; В конце концов, я новый пользователь HANA, Universes и WEBI, поэтому вопрос существует)
Вот пример, который можно запустить в HANA Studio:
WITH MyExample as (SELECT 201701011.230 as KSTBM, 0 isBad from dummy union all
SELECT 201702301.000 as KSTBM, 1 isBad from dummy union all
SELECT 201702171.230 as KSTBM, 0 isBad from dummy union all
SELECT 201702192.400 as KSTBM, 1 isBad from dummy)
SELECT to_timestamp(To_DECIMAL(KSTBM*100000,15,0)) TS,
isBad
FROM MyExample A
WHERE isBad = 1
Измените isBad на 0, и он заработает; измените isBad на 1, и вы увидите ошибку.
Аспекты вопроса:
- Как я могу заставить этот запрос работать без ошибок, независимо от того, имеет ли isBad значение 1 или 0?
- Есть ли способ / способ включить / не включать плохие данные (возможно, установить для всех плохих данных значение NULL в результате, а затем пустые данные могут быть включены / исключены по выбору пользователя?
- есть ли способ в представлении идентифицировать эти плохие записи в вычисляемом столбце, чтобы мы не пытались преобразовать их, если они недействительны, и пытались, когда они действительны?
- Мой подход просто неправильный, и мне нужно переучить свой мозг Oracle / MS SQL / MySQL, чтобы думать по-другому? На других языках я бы обработал исключения или попробовал поймать или использовать
isdate()
для проверки допустимости перед попыткой приведения ... Я просто не вижу здесь этих параметров (но я новичок и, возможно, просто не могу очень хорошо использовать справку пока что)
Спасибо, что прочитали мой длинный вопрос. Надеюсь, я предоставил достаточно подробностей.
Я пытаюсь избежать:
- https://blogs.sap.com/2017/05/10/to_date-to-isdate-udf-to-check-whether-string-is-date-or-not/
- и DATE_CHECK_PLAUSIBILITY - это функция ABAP (я ищу SQL / HANA Studio), но это правильный путь .... Я думаю ...