Каков наилучший способ рассчитать возраст в годах от даты рождения в sqlite3?
SQLite: как рассчитать возраст от даты рождения
Ответ 1
SELECT (strftime('%Y', 'now') - strftime('%Y', Birth_Date)) - (strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date));
Это работает.
Я просто портировал этот пример MySQL: http://dev.mysql.com/doc/refman/5.0/en/date-calculations.html
Ответ 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" будет иметь возраст.