2010-06-26 159 views

Respuesta

1

yo encontramos este que tal vez le ayudaría:

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; 

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

-1

es muy dificil de hacer en SQLLite ... así que es mejor que retrive la fecha de nacimiento de la base de datos nd luego añadir esta lógica

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); 
} 

La primera función calculará la fecha de nacimiento en formato de calendario, segundo calculará la fecha actual, el tercero encontrará la diferencia entre los dos. Estas funciones deben llamarse como se muestra a continuación

dateOfBirth = mConvert_Date_To_Calendar (edad);

currentDate = myCurrentCalender();

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

"candidateAge" tendrá la edad.

+0

'Calendario dateOfBirth; Calendario currentDate; int candidateAge; ' estos son los tipos de datos de esas variables – tejasvi

0

Para obtener la respuesta de @Bruno Costa para trabajar, tuve que agregar corchetes al cálculo de diferencia de tiempo en la 4ª línea e invertir la comparación a 'ahora' para ser menor o igual: según entiendo, el cálculo está funcionando si la fecha calculada es antes o después de hoy. Si la fecha calculada es hoy en día, o antes, entonces el cumpleaños ya ha sido este año o el que es hoy:

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; 

Tenga en cuenta que la solución ligada a la respuesta de @Bruno en Costa fue puesto a prueba.

4

Solo para aclarar kai's answer (parece que la edición que ahora es mucho más desagradable, y las observaciones tienen una fuerte limitación de tamaño y problemas de formato):

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

Supongamos que queremos años completos: para el primer año calendario de la vida, esto sería cero.

Para el segundo año calendario, esto dependerá de la fecha - es decir, que sería:

  • para strftime('%m-%d', 'now') >= strftime('%m-%d', Birth_Date) [ "caso A"]
  • y lo contrario ["case B"];

(Supongo que sqlite realiza una comparación lexicográfica de dos cadenas de fechas y devuelve un valor entero.)

Para cualquier otro año calendario, sería el número de años entre la corriente y la segundo - es decir strftime('%Y', 'now') - strftime('%Y', Birth_Date) - 1, más el mismo que el anterior.

En otros términos, restamos de strftime('%Y', 'now') - strftime('%Y', Birth_Date) sólo si el opuesto de "caso A" sucede - es decir, si y sólo si strftime('%m-%d', 'now') < strftime('%m-%d', Birth_Date), por lo tanto, la fórmula.

10

puede convertir las fechas a números de punto flotante y restar ...

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

... dob donde es a valid SQLite time string.

0

Otra solución es utilizar el día del año %j como una fracción del año dividiéndolo por 365.0. Así que terminan con:

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

Luego, puede emitir el resultado a un entero:

select CAST(strftime('%Y', 'now') + strftime('%j', 'now')/365.2422) - (strftime('%Y', Birth_Date) + strftime('%j', Birth_Date)/365.2422) AS INT); 

o el uso redondo() para redondear el resultado:

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

He puesto al día el cálculo, de modo que usa el número decimal correcto de días en un año solar como lo señala Robert en el comentario siguiente.

La diferencia con los otros cálculos es que el resultado de este cálculo es un número decimal que se puede convertir a un número entero (para obtener la cantidad exacta de años) o redondeado (para obtener la cantidad aproximada de años).

Para cumpleaños, la cantidad aproximada de años puede no ser tan relevante, pero para la edad de algo que usted compró tiene más sentido.

+0

Esto no es exacto. Puede mejorarlo ligeramente utilizando 365.2422, pero no se ajustará a las nociones culturales de edad. –

Cuestiones relacionadas