SQLite: как рассчитать возраст от даты рождения

Каков наилучший способ рассчитать возраст в годах от даты рождения в sqlite3?

Ответ 2

Вы можете преобразовать даты в числа с плавающей запятой и вычесть...

cast(strftime('%Y.%m%d', 'now') - strftime('%Y.%m%d', dob) as int)

... где dob допустимая строка времени SQLite.

Ответ 3

Просто, чтобы уточнить ответ kai (кажется, что редактирование сейчас очень нежелательно, а комментарии имеют сильные ограничения по размеру и форматирование):

SELECT (strftime('%Y', 'now') - strftime('%Y', Birth_Date)) 
     - (strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date) );

Предположим, что нам нужны полные годы: в течение первого календарного года жизни это будет равно нулю.

В течение второго календарного года это будет зависеть от даты - то есть:

  • 1 для strftime('%m-%d', 'now') >= strftime('%m-%d', Birth_Date) [ "case A" ]
  • и 0 иначе [ "case B" ];

(Я предполагаю, что sqlite делает лексикографическое сравнение двух строк дат и возвращает целочисленное значение.)

В течение любого другого календарного года это будет число лет между текущим и вторым - то есть strftime('%Y', 'now') - strftime('%Y', Birth_Date) - 1, плюс то же, что указано выше.

В других терминах мы вычитаем 1 из strftime('%Y', 'now') - strftime('%Y', Birth_Date) только в том случае, если происходит противоположное "case A", то есть тогда и только тогда, когда strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date), следовательно, формула.

Ответ 4

Я нашел это, возможно, поможет вам:

select
    case
        when date(dob, '+' ||
            strftime('%Y', 'now') - strftime('%Y', dob) ||
            ' years') >= date('now')
        then strftime('%Y', 'now') - strftime('%Y', dob)
        else strftime('%Y', 'now') - strftime('%Y', dob) - 1
    end
    as age
from t;

От http://www.mail-archive.com/[email protected]/msg20525.html

Ответ 5

Чтобы получить ответ @Bruno Costa на работу, мне пришлось добавить скобки вокруг вычисления разности strftime на 4-й строке и изменить сравнение на "сейчас", чтобы быть меньше или равно: как я понимаю, в расчете делается вывод о том, расчетная дата до или после сегодняшнего дня. Если расчетная дата сегодня или раньше, то день рождения уже был в этом году или сегодня:

select
    case
        when date(dob, '+' ||
            (strftime('%Y', 'now') - strftime('%Y', dob)) ||
            ' years') <= date('now')
        then strftime('%Y', 'now') - strftime('%Y', dob)
        else strftime('%Y', 'now') - strftime('%Y', dob) - 1
    end
    as age
from t;

Обратите внимание, что решение, связанное с ответом @Bruno Costa, было непроверено.

Ответ 6

Другое решение - использовать день года %j как долю года, разделив его на 365.0. Таким образом, вы получаете:

select strftime('%Y', 'now') + strftime('%j', 'now') / 365.0) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date) / 365.0);

Затем вы можете использовать ROUND() для округления результата:

select round(strftime('%Y', 'now') + strftime('%j', 'now') / 365.0) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date) / 365.0));

Ответ 7

IT очень сложно сделать в sqllite... так что лучше вы извлекаете дату рождения из базы данных и затем добавляете эту логику

private Calendar mConvert_Date_To_Calendar(String dateToConvert)
{
    // TODO Auto-generated method stub
    try
    {
        Calendar calConversion = Calendar.getInstance();
        Date date1 = null;
        try
        {
            date1 = new SimpleDateFormat("dd/MM/yy").parse(dateToConvert);
        }
        catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        calConversion.setTime(date1);
        System.out.println("mConvert_Date_To_Calender date1: " + date1
                + "caleder converted done:" + calConversion.getTime());
        return calConversion;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        Log.i(TAG, "" + e);
        return null;
    }
}


private Calendar myCurrentCalender()
{
    try
    {
        Calendar myCurrentCal = Calendar.getInstance();
        myCurrentCal.set(myCurrentCal.get(Calendar.YEAR), myCurrentCal.get(Calendar.MONTH),
                myCurrentCal.get(Calendar.DAY_OF_MONTH));
        return myCurrentCal;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        Log.e(TAG, "Unable to get current calendar!");
        return null;
    }
}

public int daysBetween(Date d1, Date d2)
{
    System.out.println("calculated age :"
            + (((d2.getTime() - d1.getTime()) / ((24 * 1000 * 60 * 60)) / 365)));

    return (int) (((d2.getTime() - d1.getTime()) / (24 * 1000 * 60 * 60)) / 365);
}

Первая функция рассчитает дату рождения в формате календаря, вторая будет вычислять текущую дату, третья - разницу между ними. Эти функции можно назвать так, как показано ниже.

dateOfBirth = mConvert_Date_To_Calendar (возраст);

currentDate = myCurrentCalender();

candidAge = daysBetween (dateOfBirth.getTime(), currentDate.getTime());

"кандидатAge" будет иметь возраст.