Как сделать функцию в базе данных DB2 для преобразования целого числа в дату, и в случае, когда 0? - PullRequest
1 голос
/ 14 ноября 2011

Я пытался заставить функцию работать в db2:

CREATE FUNCTION TO_DATE8(DATE_STRING numeric(8,0))
    RETURNS DATE
    LANGUAGE SQL
    IF DATE_STRING > 0 THEN
         // ERROR ->
         RETURN DATE ( TO_DATE ( SUBSTR ( DATE_STRING , 1 , 8 ) , 'YYYYMMDD' ) )
    ELSE
         RETURN  DATE ( TO_DATE ( '00000000' , 'YYYYMMDD' ) ) 
    END IF
END

ОШИБКА: ДАТА НЕДОПУСТИМА

Что делать?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Форма требуемой процедуры выглядит следующим образом (по крайней мере, в версии iSeries):

CREATE FUNCTION TO_DATE8(DATE_STRING numeric(8,0))          
RETURNS DATE                                            
LANGUAGE SQL
BEGIN
    RETURN(CASE WHEN DATE_STRING > 0 THEN DATE(SUBSTR(DATE_STRING, 1, 4) || '-' || 
                                               SUBSTR(DATE_STRING, 5, 2) || '-' || 
                                               SUBSTR(DATE_STRING, 7, 2))
                ELSE DATE('0001-01-01')
                END);
END

Однако:

  • Ваша процедура названа неправильно (чтение с дата-8, а не до это).
  • Ваш DATE_STRING - это не string (или даже char), это числовое значение.Пожалуйста, переименуйте его во что-то, что не включает тип данных (dateToConvert работает)
  • Вы, похоже, хотите вернуть что-то, что не действительная дата0 s).Я возвращаю *loval здесь, хотя возможно, что на самом деле это должно быть null.
  • Я не проверил достаточно чеков на действительную дату - это взорвет действительно легко.
  • Если это вообще возможно, базу данных следует изменить, чтобы она содержала фактические даты, а не числовое значение.Диск (по сравнению с головной болью программиста / архитектора) дешев.
  • Вам также может пригодиться файл календаря, если 8-значный номер был одним из включенных столбцов.
1 голос
/ 06 сентября 2013

Для блага других это можно сделать в одной строке, а не функцией:

СЛУЧАЙ, КОГДА MYDATE = 0 ПОСЛЕ НЕДОПУСТИМОЙ ДАТЫ (ВСТАВИТЬ (ВСТАВИТЬ (ВЛЕВО (CHAR (MYDATE), 8), 5,0, '-'), 8,0, '-')) END

В моем чемодане было 8 упакованных вещей.

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