SQLite:如何从出生日期计算年龄

SQLite:如何从出生日期计算年龄

问题描述:

从sqlite3的出生日期计算年龄的最佳方式是什么?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());

“候选人年龄”将有年龄。

+0

'日历dateOfBirth; 日历currentDate; int candidateAge;' 这些是这些变量的数据类型 – tejasvi 2012-04-27 09:00:39

要得到@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) 

...其中doba 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的注释中指出,它使用太阳年的正确小数天数。

与其他计算的区别在于,此计算的结果是可以转换为整数(以获得确切的年数)或四舍五入(以获得近似年数)的十进制数。

对于生日,大概的年数可能并不相关,但对于您购买的东西的年代更有意义。

+0

这是不准确的。您可以通过使用365.2422来稍微改进它,但它不符合年龄的文化概念。 – 2018-02-28 10:16:51