2013-08-12 1 views
2

У меня есть поле даты в MySQL в 1988-04-04 format.I нужно вычислить возраст в 25/04 месяцев format.I попытался это:mysql запрос для получения формата 25/04 месяцев, где формат даты - 1988-04-04?

SELECT CONCAT(
    FLOOR((curdate() - dob)/31536000), 
    'y ', 
    FLOOR(MOD((curdate() - dob)/31536000 * 12, 12)), 
    'm' 
) `age` from age 

Это дает мне 0/0 месяцев. Буду благодарен за любую помощь.

+3

Первые вещи первое, что формат 25/04? :-) Или это должен быть формат года/месяца для возраста? – paxdiablo

+2

И что означает 1988-04-04. Это yyyy-mm-dd или yyyy-dd-yy ?? – Novice

+0

Я предполагаю, что поле «dob» находится в таблице «возраст»? –

ответ

1

Когда вы выбираете curdate() в цифровом контексте, вы получаете значение yyyymmdd, например 20130812 (на сегодня, 12 августа 2013 г.). Это не очень полезно для расчета даты.

В качестве примера, моя дата рождения (старый пердит, который я есть) будет 19650202. Когда вы определяете числовое различие между этим и сегодня, вы получаете 480610.

Теперь, если вы разделите что на 31536000 (не знаю, где вы получили, что с), вы definitiely получить ноль, несмотря на то, что я 48-летний чудак :-)

Вы было бы намного лучше использовать datediff(), чтобы определить количество разниц между двумя датами, а затем применить правильные операции деления и модуляции, чтобы получить полтора года и месяцы от этого, что-то вроде (непроверено, но должно быть хорошим началом):

select 
    floor (100 * datediff (curdate(), dob)/36525) as years, 
    floor (mod (100 * datediff (curdate(), dob), 36525)/100/30) as months 
from age 

Это не будет совершенным, так как местонахождение високосного года повлияет на него немного, фактических дней в году составляет 365.2425 в долгосрочной перспективе, и мы принимаем точно 30 дней в месяц, но это должно быть точным в течение нескольких дней.

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

Это, вероятно, будет влечь за собой с помощью year() и month() извлечь соответствующие поля из обоих dob и текущий день и вычитания тех, корректируя, если, если текущая дата предшествует дню рождения в текущем году.

0

Использование DATEDIFF как предложено paxdiablo:

SELECT 
    FLOOR(DATEDIFF(CURDATE(), dob)/365.25) AS years, 
    FLOOR(MOD(DATEDIFF(CURDATE(), dob), 365.25)/(365.25/12)) AS months 
FROM age