Oracle. Как получить возраст человека.
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 запихнуть =(
Отличная шутка.
есть один аргумент, но он не имеет практического смысла в ближайшие 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
ну и округлить
резве нет ?
Кстати,у меня была такая мысль тоже,но как то это примерно тоже самое,что Вонд предлагал вначале =)
Date - Date получается не интервал что ли?
и вообще,что то я не улавливаю разницу в оракле между Date и Datetime =(
интервалы в Оракле - для меня пока довольно загадочная штука
А в таблице операндов везде стоит 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
По моему DataTypes в первом разделе, Datetime/Interval Arithmetic
что то я не улавливаю разницу в оракле между Date и DatetimeОна заключена в названии
Date - это дата.
Datetime - дата+время.
Удивительно, не правда ли
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
Хогвардс на форум.локал.
Но вот только не понятно,почему имеет место быть следующее :интервал не того типа
Date - это дата.это такая несмешная шутка была? типа Datetime в Оракле нету, а Date включает в себя время с точностью до секунд.
Datetime - дата+время.
Удивительно, не правда ли
а как исправить то? =)
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
Собственно есть две даты,одна из них - дата рождения,вторая допусти текущая.Чо то туплю,но никак не могу понять,как получить количество полных лет,пол крайней мере нормальным способом.