SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Посчитать возраст
Посчитать возраст [сообщение #4007] Tue, 09 January 2024 15:13 Переход к следующему сообщению
pastor в настоящее время не в онлайне  pastor
Сообщений: 83
Зарегистрирован: June 2022
Географическое положение: Калуга
Member
Думал, что умею

select datediff( year, cast('27.07.1990' as date), cast('01.01.2024' as date)),
       dateadd( year, 34, cast('27.07.1990' as date))
from RDB$DATABASE
результат 34 Sad

PS для ленивых

select datediff( year, :DATE_BORN, CURRENT_DATE) -
       iif( dateadd( year, (datediff( year, :DATE_BORN, CURRENT_DATE)), :DATE_BORN) > CURRENT_DATE, 1, 0)
from RDB$DATABASE

[Обновления: Tue, 09 January 2024 15:27]

Известить модератора

Re: Посчитать возраст [сообщение #4008 является ответом на сообщение #4007] Tue, 09 January 2024 15:29 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
select trunc((datediff( day, cast('27.07.1990' as date), CURRENT_DATE) + 1) / 365.25)
from RDB$DATABASE
Re: Посчитать возраст [сообщение #4010 является ответом на сообщение #4008] Tue, 09 January 2024 16:00 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Тут могут быть погрешности в дельта-окрестности дня рождения, неприемлемые для медиков и юристов.
Re: Посчитать возраст [сообщение #4011 является ответом на сообщение #4010] Tue, 09 January 2024 16:13 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 82
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
У меня есть такая функция для определения целого количества дней/месяцев/лет между датами

create or alter function GET_DATE_PART (
    D1 date,
    D2 date,
    VID integer = 0)
returns integer
as
declare variable y int;
declare variable d01 date;
declare variable d02 date;
begin
  d01 = minvalue(d1, d2);
  d02 = maxvalue(d1, d2);

  if (vid = 0) then -- Дни
    y = d02 - d01 + 1;
  else
  if (vid = 1) then -- Месяцы
    y = datediff(month, d01 - extract(day from d01) + 1, d02 - extract(day from d01) + 2);
  else
  if (vid = 2) then -- Годы
  begin
    y = extract(year from d02) - extract(year from d01);
    if (dateadd(year, y, d01) > d02) then
      y = y - 1;
  end

  if (d2 < d1) then y = -y;
  return y;
end
GET_DATE_PART('27.07.1990', '01.01.2024', 2) = 33
Re: Посчитать возраст [сообщение #4012 является ответом на сообщение #4007] Tue, 09 January 2024 17:04 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
https://sqlru.net/index.php/m/2070/#msg_2070

Но там тоже есть неточность, надо поаккуратнее. Если года рождения и исследования разновисокосные, а день рождения после 28 февраля, то в сам ДР +- сутки формально будет ошибка.

[Обновления: Tue, 09 January 2024 17:09]

Известить модератора

Re: Посчитать возраст [сообщение #4013 является ответом на сообщение #4012] Tue, 09 January 2024 17:28 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Вот так точно:
create function calculate_age(
    birthday date
  , otherday date
)returns
    integer
as
    declare variable birthyear integer;
    declare variable otheryear integer;
    declare variable age       integer;
begin

    birthyear = extract( year from birthday );
    otheryear = extract( year from otherday );
    age       = otheryear - birthyear;

    if(          extract( month from birthday ) > extract( month from otherday ) )then begin
        age = age - 1;
    end else if( extract( month from birthday ) = extract( month from otherday ) )then begin
        age = iif( extract( day from birthday ) > extract(   day from otherday ), age - 1, age );
    end

    return age;
end
Предыдущая тема: Поломка базы. Нужна помощь
Следующая тема: RDB$CHECK_CONSTRAINTS
Переход к форуму:
  


Текущее время: Sat Nov 23 16:04:45 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00664 секунд