Как написать код в Oracle SQL (например, «CCYYMMDD» на 102) - PullRequest
0 голосов
/ 28 ноября 2018

Как записать код в Oracle SQL (например, 'CCYYMMDD' в 102)?Если кто-то введет дату во внешнем интерфейсе, значение должно возвращаться как 102 вместо даты.Для этого, как записать функцию в Oracle PLSQL.

https://www.unece.org/trade/untdid/d00a/tred/tred2379.htm Это стандартный формат ANSI.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы не можете написать функцию, чтобы определить, какая числовая строка даты соответствует какому формату, поскольку строка даты может иметь несколько форматов:

Например, 010203 может быть:

  • Формат 2: DDMMYY 1 февраля 03
  • Формат 3: MMDDYY 2 января 03
  • Формат 101: YYMMDD 3 февраля 01
  • Формат 306: DDHHMM 02:03 дня 1
  • Формат 402: HHMMSS 01: 02: 03
  • Формат 405: MMMMSS 102 минуты 3 секунды
  • Формат 610:CCYYMM Март 0102
  • Формат 616: CCYYWW Неделя 3 из 0102

Аналогично 10080102 может быть:

  • Формат 4: DDMMCCYY 10 августа 102
  • Формат 102: CCYYMMDD 2 января 1008
  • Формат 305: MMDDHHMM 8 октября 01: 02
  • Формат 501: HHMMHHMM Времядиапазон от 10:08 до 01: 01

Если кто-либо вставит дату в этом формате «CCYYMMDD», тогда значение будет возвращать только 102 по умолчанию во внешнем интерфейсе.Как написать код на SQL?

Вы не можете, как я описал выше, двусмысленно, что некоторые значения, и они могут возвращать несколько форматов.Вместо этого вам следует создать еще один столбец и сохранить формат даты в том случае, если пользователь вводит дату, а не пытаться восстановить код формата из (неоднозначного) числа.

0 голосов
/ 29 ноября 2018

Вы можете проверить, что строка соответствует формату даты следующим образом:

create or replace function is_CCYYMMDD 
    (p_str in varchar2)
    return boolean
is
    rv boolean;
    dt date;
begin
    begin
        dt := to_date(p_str, 'YYYYMMDD');
        dt := to_date('2000' || substr(p_str, 5), 'YYYYMMDD');
        rv := true; 
    exception
        when others then
            rv := false;
    end;
    return rv;
end;

Первая to_date() просто проверяет, что вся строка является допустимой датой.Вторая to_date() проверяет, что вторая половина строки является допустимым комбинированием месяца и дня.Это отчасти касается @ MTO наблюдений о проблемах применения строгого формата, когда некоторые строки могут соответствовать более чем одному формату.

Обратите внимание, что вполне возможно иметь действительные даты, которые проходят этот тестнесмотря на двусмысленность, например, 20111012 в 'YYYYMMDD' или 'DDMMYYYY'?Невозможно быть уверенным, если вы не введете строгое форматирование даты во входном интерфейсе с помощью виджета выбора даты или отдельных полей ввода для года, месяца и дня.

почему вы передаете '2000' в этом запросе?

Вторая проверка подтверждает, что последние четыре символа действительны как месяц и день.Всякий раз, когда мы проводим такого рода тесты, мы сталкиваемся с проблемой високосных лет.Если мы просто применим to_date(str, 'MMDD'), Oracle по умолчанию установит год для текущего года: ошибка 2018029 не является допустимой датой, даже если исходный ввод 20160229 действителен.Моя функция избегает этого, установив элемент year в 2000, который был високосным.


Кстати, если вы хотите использовать эту функцию в SQL, вам нужно изменить тип возвращаемого типа на varchar2 (Флаг Y / N) или число (1/0), потому что SQL не поддерживает Booolean.

0 голосов
/ 28 ноября 2018

Если вы хотите преобразовать дату Oracle в юлианскую дату, то вы можете использовать функцию TO_CHAR с 'j' в качестве формата.

SELECT TO_CHAR(TO_DATE('BC47120412', 'BCYYYYMMDD'), 'J')
  FROM DUAL;

Output: 0000102

Если вы хотите преобразовать юлианскую дату в оракульную датузатем используйте запрос ниже,

SELECT TO_DATE(102, 'J') 
  FROM DUAL;

Output: 04/12/4712 12:00:00 AM BC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...