Oracle. Как получить возраст человека.

wwoland

Собственно есть две даты,одна из них - дата рождения,вторая допусти текущая.
Чо то туплю,но никак не могу понять,как получить количество полных лет,пол крайней мере нормальным способом.

ava3443

вот такое покатит?
SELECT FLOORSYSDATE - TO_DATE('26-11-1982', 'dd-mm-YYYY'/365.25) FROM DUAL;

wwoland

Корявенько как то,если честно.

eduard615

extract

6yrop

 

SELECT
CASE
WHEN MONTH(dateOfBirthDt) > MONTH(now) OR
(MONTH(dateOfBirthDt) = MONTH(now) AND DAY(dateOfBirthDt) > DAY(now
THEN YEAR(nowDt) - YEAR(dateOfBirthDt) - 1
ELSE
THEN YEAR(nowDt) - YEAR(dateOfBirthDt)
END
FROM ....

такой алгоритм был у нашего заказчика

wwoland

ну да,я тоже об этом думал,но решил какое нибудь встроенное решение поискать.

6yrop

ты спросил про нормальный способ, а не про встроенное решение

ava3443

Хню написал =\
аргументы будут?

krishtaf

наверно смутила таблица dual

wwoland

я про себя,а не про тебя =)
я пост подправил =)
а вот по описанию Extract - то что нужно,только что то не могу в нее Interval запихнуть =(

wwoland

Отличная шутка.

maggi14

есть один аргумент, но он не имеет практического смысла в ближайшие 94 года. В году не 365.25, а 365.24 с хреном дня.

ava3443

а вот по описанию Extract - то что нужно,только что то не могу в нее Interval запихнуть =(
SQL> SELECT EXTRACT(YEAR FROM (CURRENT_DATE - CAST(TO_DATE('26-11-1982', 'dd-mm-YYYY') AS DATE YEAR TO MONTH) AS AGE FROM DUAL;
AGE
----------
23
Ну или:
SELECT EXTRACT(YEAR FROM (CAST(nowDt AS DATE) - CAST(dateOfBirthDt AS DATE YEAR TO MONTH)
FROM ...
Update: Похоже, можно и без CAST

lakmi

манс бетвин курент_дата, дата_рождения /12
ну и округлить

резве нет ?

wwoland

Блин,Олуть,вот кого кого,а тебя не ожидал тут увидеть =)
Кстати,у меня была такая мысль тоже,но как то это примерно тоже самое,что Вонд предлагал вначале =)

wwoland

У меня такой вопрос возник.
Date - Date получается не интервал что ли?

wwoland

и вообще,что то я не улавливаю разницу в оракле между Date и Datetime =(

ava3443

интервалы в Оракле - для меня пока довольно загадочная штука

wwoland

Просто в описании типов данных Оракла присутствует тип данных Date.
А в таблице операндов везде стоит Datetime.
Причем напртив Datetime - Datetime стоит сносочка,что операция не валидна для Date.
Ничего не понимаю =(

ava3443

А в таблице операндов везде стоит Datetime.
а откуда эта таблица?

ava3443

А в таблице операндов везде стоит Datetime.
Судя по ораклиной документации на девятку, когда пишут datetime, имеют ввиду значение типа DATE, TIMESTAMP, или одного из вариантов TIMESTAMP.

The datetime datatypes are DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE. Values of datetime datatypes are sometimes called "datetimes".

ava3443

Причем напртив Datetime - Datetime стоит сносочка,что операция не валидна для Date.
не нашёл токой сноски в документации на девятку: Operators in Datetime/Interval Value Expressions

wwoland

таблица и документации к 9.2 SQL reference
По моему DataTypes в первом разделе, Datetime/Interval Arithmetic

durka82

что то я не улавливаю разницу в оракле между Date и Datetime
Она заключена в названии
Date - это дата.
Datetime - дата+время.
Удивительно, не правда ли

wwoland

ну ты пиздец умный я посмотрю
Date содержит в себе время,если что и вообще мне уже объяснили =)

wwoland

казалось бы всем хорошо решение и я как раз чего то типа этого хотел.
Но вот только не понятно,почему имеет место быть следующее :

SQL> SELECT EXTRACT(YEAR FROM (CURRENT_DATE - CAST(TO_DATE('01-09-1984', 'dd-mm-YYYY') AS DATE YEAR TO MONTH) AS AGE FROM DUAL;

AGE
----------
22

SQL> SELECT EXTRACT(YEAR FROM (CURRENT_DATE - CAST(TO_DATE('14-09-1984', 'dd-mm-YYYY') AS DATE YEAR TO MONTH) AS AGE FROM DUAL;

AGE
----------
22


SQL> SELECT EXTRACT(YEAR FROM (CURRENT_DATE - CAST(TO_DATE('15-09-1984', 'dd-mm-YYYY') AS DATE YEAR TO MONTH) AS AGE FROM DUAL;

AGE
----------
21

School_11

> Oracle. Как получить возраст человека.
Хогвардс на форум.локал.

ava3443

Но вот только не понятно,почему имеет место быть следующее :
интервал не того типа

ava3443

Date - это дата.
Datetime - дата+время.
Удивительно, не правда ли
это такая несмешная шутка была? типа Datetime в Оракле нету, а Date включает в себя время с точностью до секунд.

wwoland

всмысле не того типа?
а как исправить то? =)

ava3443

Подсказывают, что при помощи MONTHS_BETWEEN можно получить ещё один вариант с FLOOR, но уже без недостатка в виде деления на подозрительные 365.25
SELECT FLOOR ( MONTHS_BETWEEN (CURRENT_DATE, TO_DATE('30-08-1982','DD-MM-YYYY') ) / 12) AS AGE
FROM DUAL;

lakmi

TO_DATE('30-08-1982','DD-MM-YYYY')
а это зачем? у меня и без этого обычно считает

wwoland

На всякий случай =)

ava3443

а это зачем?
зачем преобразовывать строку в тип DATE?
у меня без этого не работает

lakmi

ну у нас даты обычно уже и так даты. наоборот ту_чаром обрабатывать порой приходится

ava3443

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

lakmi

понятно

кстати, а как победить округление? оно же будет прибавлять год во второй половине до др

ava3443

Так я и не использовал округление. FLOOR делает то что нужно. Как альтернатива - TRUNC, результат будет тем же.

wwoland

Блин,ты ораклистка?
офигеть,респект =)

abzal.kz

Реклама в телефоне очень понравилась))
Оставить комментарий
Имя или ник:
Комментарий: