Oracle. Как получить возраст человека.
вот такое покатит?
SELECT FLOORSYSDATE - TO_DATE('26-11-1982', 'dd-mm-YYYY'/365.25) FROM DUAL;
SELECT FLOORSYSDATE - TO_DATE('26-11-1982', 'dd-mm-YYYY'/365.25) FROM DUAL;
Корявенько как то,если честно.
extract
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 ....
такой алгоритм был у нашего заказчика
ну да,я тоже об этом думал,но решил какое нибудь встроенное решение поискать.
ты спросил про нормальный способ, а не про встроенное решение 

Хню написал =\аргументы будут?
наверно смутила таблица dual
я про себя,а не про тебя =)
я пост подправил =)
а вот по описанию Extract - то что нужно,только что то не могу в нее Interval запихнуть =(
я пост подправил =)
а вот по описанию Extract - то что нужно,только что то не могу в нее Interval запихнуть =(
Отличная шутка.
есть один аргумент, но он не имеет практического смысла в ближайшие 94 года. В году не 365.25, а 365.24 с хреном дня.
а вот по описанию 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

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

ну и округлить

резве нет ?
Блин,Олуть,вот кого кого,а тебя не ожидал тут увидеть =)
Кстати,у меня была такая мысль тоже,но как то это примерно тоже самое,что Вонд предлагал вначале =)
Кстати,у меня была такая мысль тоже,но как то это примерно тоже самое,что Вонд предлагал вначале =)
У меня такой вопрос возник.
Date - Date получается не интервал что ли?
Date - Date получается не интервал что ли?
и вообще,что то я не улавливаю разницу в оракле между Date и Datetime =(
интервалы в Оракле - для меня пока довольно загадочная штука 

Просто в описании типов данных Оракла присутствует тип данных Date.
А в таблице операндов везде стоит Datetime.
Причем напртив Datetime - Datetime стоит сносочка,что операция не валидна для Date.
Ничего не понимаю =(
А в таблице операндов везде стоит Datetime.
Причем напртив Datetime - Datetime стоит сносочка,что операция не валидна для Date.
Ничего не понимаю =(
А в таблице операндов везде стоит Datetime.а откуда эта таблица?
А в таблице операндов везде стоит 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".
Причем напртив Datetime - Datetime стоит сносочка,что операция не валидна для Date.не нашёл токой сноски в документации на девятку: Operators in Datetime/Interval Value Expressions
таблица и документации к 9.2 SQL reference
По моему DataTypes в первом разделе, Datetime/Interval Arithmetic
По моему DataTypes в первом разделе, Datetime/Interval Arithmetic
что то я не улавливаю разницу в оракле между Date и DatetimeОна заключена в названии

Date - это дата.
Datetime - дата+время.
Удивительно, не правда ли

ну ты пиздец умный я посмотрю
Date содержит в себе время,если что и вообще мне уже объяснили =)
Date содержит в себе время,если что и вообще мне уже объяснили =)
казалось бы всем хорошо решение и я как раз чего то типа этого хотел.
Но вот только не понятно,почему имеет место быть следующее :
Но вот только не понятно,почему имеет место быть следующее :
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
> Oracle. Как получить возраст человека.
Хогвардс на форум.локал.
Хогвардс на форум.локал.
Но вот только не понятно,почему имеет место быть следующее :интервал не того типа

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

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

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

ну дык я для примера, чтоб можно было проверить пример не имея под рукой базы (не создавая таблицу).
понятно
кстати, а как победить округление? оно же будет прибавлять год во второй половине до др
кстати, а как победить округление? оно же будет прибавлять год во второй половине до др
Так я и не использовал округление. FLOOR делает то что нужно. Как альтернатива - TRUNC, результат будет тем же.
Блин,ты ораклистка?
офигеть,респект =)
офигеть,респект =)
Реклама в телефоне очень понравилась))
Оставить комментарий
wwoland
Собственно есть две даты,одна из них - дата рождения,вторая допусти текущая.Чо то туплю,но никак не могу понять,как получить количество полных лет,пол крайней мере нормальным способом.