getAge в SQL в зависимости от двух дат

Я пытаюсь рассчитать возраст человека в зависимости от двух дат. Это работает только для 50% людей, зарегистрированных в базе данных, а для остальных это просто возраст первого человека.

Есть идеи, где проблема может быть?

CREATE OR REPLACE FUNCTION getAge ()
       RETURNS INT
       LANGUAGE SQL
    AS
    $$
    SELECT CAST (
                (EXTRACT (YEAR FROM CURRENT_DATE))
              - (EXTRACT (YEAR FROM birth_date)) AS INTEGER)
      FROM person;
    $$;

3 ответа

Существует форма с двумя аргументами age() Вы можете использовать для этого

age(timestamp, timestamp)   interval

Вычтите аргументы, получая "символический" результат, который использует годы и месяцы, а не просто дни (отметка времени '2001-04-10', отметка времени '1957-06-13') 43 года 9 месяцев 27 дней

Использовать его довольно просто.

SELECT age('1978-01-24'::date, '1972-02-24'::date);

       age       
-----------------
 5 years 11 mons
(1 row)

На Postgres вы можете использовать функцию возраста

+----------------+----------+------------------------------------------+-----------------------------+------------------------+
| age(timestamp) | interval | Subtract from current_date (at midnight) | age(timestamp '1957-06-13') | 43 years 8 mons 3 days |
+----------------+----------+------------------------------------------+-----------------------------+------------------------+
select extract(year from age(timestamp '1957-06-13'))
| date_part |
|: -------- |
| 59 |

dbfiddle здесь

Время Unix может быть тем, что вы ищете: используйте php, чтобы преобразовать формат даты в unix, самое большое число - текущее время. Преобразуйте также дату рождения, это будет меньшее число... вычислите время с двумя числа, которые у вас есть, и конвертируйте время Unix в формат даты, который вы хотели бы использовать, это можно сделать с помощью php

Другие вопросы по тегам