2015-08-18 5 views
0

Я пытаюсь вычислить ages для people по отношению к данным monthly, поэтому их birth date будет отображать круглое число за данный месяц.
Однако у меня есть несколько строк, которые предоставляют мне negative возрастов.

Есть ли способ в этой формуле сделать это
1. Absolute Соотношение?
2. Birth date больше, чем год, просто дайте мне 0?Возрастные расчеты

floor(months_between(to_date('31-JAN-14','DD-MON-YY'),DATE_OF_BIRTH)/12) as AGE 
+0

Похоже, вы нашли одну из проблем с двухзначными годами. Эти будущие даты рождения, вероятно, произошли в 1900 году или ранее, но, пройдя только две последние цифры, вы потеряли информацию о столетии. Если вы загружаете данные о возрасте, попробуйте изменить маску формата с «DD-MON-YY» на «DD-MON-RR», чтобы лучше угадать правильное столетие, а не просто использовать текущий век. – Sentinel

+0

Что означает, что «дата рождения» будет больше, чем год? Какой год? Мы просто сравниваем годы или делаем месяцы и дни? В приведенном выше примере, если DOB был 1-Jun-14, тогда годы одинаковы (они оба равны 14), но DOB в будущем, поэтому ваша функция возвращает возраст -1, ABS которого составляет 1. Это ваш желаемый результат? – Sentinel

ответ

1

Что касается первого вопроса, то, возможно, вы после этого:

floor(abs(months_between(to_date('31-JAN-14','DD-MON-YY'),DATE_OF_BIRTH)/12)) as AGE

Я не уверен, если выше, также отвечает на ваш второй вопрос, или ли вы после того, как дело заявление, такие как:

case when date_of_birth > p_some_year then 0 
    else floor(abs(months_between(to_date('31-JAN-14','DD-MON-YY'),DATE_OF_BIRTH)/12)) 
end as age 
+0

и какая ошибка? (первый комментарий у меня есть то, что 'to_date ('E1.Year_Month', 'YYYY-MM')' должно быть 'to_date (E1.Year_Month, 'YYYY-MM')'. То есть, ставя одинарные кавычки вокруг E1. Year_Month, вы говорите Oracle, что это строка, которая, вероятно, не то, что вы хотите сделать ...) – Boneist

+0

Извините. Я починил это. Благодарим вас за вашу дальнейшую помощь. – Tinkinc

+0

Нет проблем, и я рад, что вы получили его. – Boneist

0

Вместо того, чтобы абсолютное значение или ноль, вы можете просто добавить 100 к негативным датам:

floor(months_between(to_date('31-JAN-14','DD-MON-YY'),DATE_OF_BIRTH)/12) 
+ case when DATE_OF_BIRTH > to_date('31-JAN-14','DD-MON-YY') then 100 
     else 0 
    end as AGE 

Если вы действительно хотите, возраст нуля для будущих дат рождения вместо отрицательного числа или раствора выше, то используйте:

greatest(0,floor(months_between(to_date('31-JAN-14','DD-MON-YY'),DATE_OF_BIRTH)/12)) as AGE 

Абсолютное значение не требуется для любого из указанных выше решений ни для любого другого решения, которое возвращает ноль для будущих дат рождения.