Рассчитать возраст в Oracle/Toad - используя значения из двух столбцов

У меня есть два столбца Oracle (в VIEW, а не в таблице) — DateOfBirth и MembershipDate. Я пытаюсь создать новый столбец, в котором будет отображаться возраст человека на дату вступления в членство.


Примеры столбцов:
Дата рождения: 05.01.1975
Дата членства: 09.01.2015
AgeWhenBecameMemb: 40

Как мне заставить третий столбец рассчитываться на лету, пожалуйста?


Я хочу реализовать это, используя что-то вроде этого:

ВЫБЕРИТЕ ЭТАЖ(MONTHS_BETWEEN(DATE '2012-01-01', DATE '2010-10-10')/12) AS AgeWhenBecameMemb from DUAL

Спасибо!


person Mr.L    schedule 18.09.2015    source источник
comment
Можете ли вы опубликовать ошибку, которую вы получаете? Формула, кажется, работает нормально для меня? (может быть ваш формат даты, когда вы используете DATE '2012-01-01'... попробуйте поместить туда имена столбцов или использовать функцию to_date()   -  person Ditto    schedule 18.09.2015
comment
Да, приведенный выше код работает. Однако мои значения даты указаны в формате ДД/ММ/ГГГГ - этот формат не принимается. :(   -  person Mr.L    schedule 18.09.2015
comment
Л: .. ок... так ты дашь нам знать, что принято и что тебе нужно? или мы должны продолжать гадать? O.o Возможно, вы захотите пересмотреть вопрос о том, чтобы переписать свой вопрос ... он четко спрашивает, как мне заставить третий столбец рассчитываться на лету ... на это был дан ответ ... однако у меня создалось впечатление, что это не тот вопрос, на который вы хотели ответить ... Оо   -  person Ditto    schedule 18.09.2015


Ответы (3)


какая версия оракла?

В Oracle 11 или более поздних версиях у вас есть виртуальные столбцы: проверьте это: https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:676611400346196844 ...

до этого вы могли рассмотреть представление или материализованное представление - в зависимости от других ваших потребностей.

person Ditto    schedule 18.09.2015
comment
Оракл 12.1. Я создаю здесь представление, пытаясь создать новый столбец (AgeWhenBecamememb) в этом представлении, используя значения DateOfBirth и MembershipDate. у меня просто не получается рассчитать - person Mr.L; 18.09.2015

Используйте функцию TO_DATE() для указания собственного формата даты. Например:

select to_date('01/05/1975','dd/mm/yyyy') as DateOfBirth
     , to_date('01/09/2015','dd/mm/yyyy') as MembershipDate
     , FLOOR(MONTHS_BETWEEN(to_date('01/09/2015','dd/mm/yyyy'), to_date('01/05/1975','dd/mm/yyyy'))/12) AS AgeWhenBecameMemb
from dual;

Для ваших конкретных данных:

select FLOOR(MONTHS_BETWEEN(to_date(MembershipDate,'dd/mm/yyyy'), to_date(DateOfBirth,'dd/mm/yyyy'))/12) AS AgeWhenBecameMemb
from dual;

Синтаксис, который вы пытаетесь использовать (литералы даты ANSI), описан здесь: http://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

Согласно документации:

Литерал даты ANSI не содержит части времени и должен быть указан в формате «ГГГГ-ММ-ДД». В качестве альтернативы вы можете указать значение даты Oracle, как в следующем примере:
TO_DATE('98-DEC-25 17:30','YY-MON-DD HH24:MI')

person Mark Leiber    schedule 18.09.2015

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

(выберите пол (TO_CHAR (MembershipDate, 'гггг-мм-дд'), TO_CHAR (DateOfBirth, 'гггг-мм-дд')) /12) AS AGE_OF_CONSUMER из двойного) AS AgeWhenBecameMemb

Поля, используемые для сравнения, уже были в формате даты.

Спасибо.

person Mr.L    schedule 21.09.2015