SQLite:如何从出生日期计算年龄
我发现这也许会帮助你:
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
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
这是非常难治的sqllite做......所以你更好retrive从数据库中出生日期ND再加入这个逻辑
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(age);
currentDate = myCurrentCalender();
candidateAge = daysBetween(dateOfBirth.getTime(),currentDate.getTime());
“候选人年龄”将有年龄。
要得到@Bruno Costa的工作答案,我必须在第4行的strftime差异计算周围添加括号,并将“now”的比较反转为小于或等于:据我所知,计算正在进行无论计算日期是在今天之前还是之后。如果今天或更早计算的日期是那么的生日已是今年年底或者是今天:
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科斯塔的回答解挂是未经检验的。
只是为了澄清kai's answer(似乎编辑现在是非常不受欢迎的,及意见具有很强的大小限制和格式问题):
SELECT (strftime('%Y', 'now') - strftime('%Y', Birth_Date))
- (strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date));
假设我们想整年:第一个日历年生活中,这将是零。
对于第二日历年,这将取决于日期 - 即它是:
- 为
strftime('%m-%d', 'now') >= strftime('%m-%d', Birth_Date)
[ “情况下甲”] - 和否则[“case B”];
(我认为sqlite做两个日期字符串的字典对比并返回一个整数值。)
对于其他任何日历年内,这将是年内当前和秒之间的数字 - 即strftime('%Y', 'now') - strftime('%Y', Birth_Date) - 1
,再加上与上面相同。
在其它方面,我们减去1从strftime('%Y', 'now') - strftime('%Y', Birth_Date)
仅当的相反“情况下甲”发生 - 即,当且仅当strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date)
,因此该公式。
您可以转换日期以浮点数和减...
cast(strftime('%Y.%m%d', 'now') - strftime('%Y.%m%d', dob) as int)
...其中dob
是a valid SQLite time string。
另一种解决方法是将年份中的日期%j
除以365.0作为年份的一部分。所以,你最终用:
select strftime('%Y', 'now') + strftime('%j', 'now')/365.2422) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date)/365.2422);
然后,您可以把结果为一个整数:
select CAST(strftime('%Y', 'now') + strftime('%j', 'now')/365.2422) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date)/365.2422) AS INT);
或使用ROUND()四舍五入的结果:
select round(strftime('%Y', 'now') + strftime('%j', 'now')/365.2422) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date)/365.2422));
我已经更新计算方法如下,在Robert的注释中指出,它使用太阳年的正确小数天数。
与其他计算的区别在于,此计算的结果是可以转换为整数(以获得确切的年数)或四舍五入(以获得近似年数)的十进制数。
对于生日,大概的年数可能并不相关,但对于您购买的东西的年代更有意义。
这是不准确的。您可以通过使用365.2422来稍微改进它,但它不符合年龄的文化概念。 – 2018-02-28 10:16:51
'日历dateOfBirth; 日历currentDate; int candidateAge;' 这些是这些变量的数据类型 – tejasvi 2012-04-27 09:00:39