Pregunta

Me he enfrentado a una situación muy extraña aquí. Yo soy el acceso a la base de datos (MDB) a través de JET. Yo uso DBGrid y DBNavigator para permitir el acceso de usuarios él. Conjunto de datos se ha creado usando el componente TADOQuery, con la siguiente consulta:

SELECT *, (DateDiff ('y',[Birth Date], Now())) AS [Age] FROM TableName

Se trabaja muy bien. Pero cada vez que se presiona el botón Actualizar en DBNavigator el resultado de este campo calculado se vuelve incorrecta. Por ejemplo, si normalmente He 7 se muestra en la columna edad, después de presionar de refresco se convierte en 40149, 7 cambios a 40149, 6 cambios a 40.150, de 0 a 40156 etc. Con el fin de ver resultado correcto que necesito para volver a abrir consulta de nuevo.

Cualquiera puede ayudar?

¿Fue útil?

Solución

Intente lo siguiente, que devolverá la edad en días.

SELECT *, CINT(Now()-[Birth Date]) as AGE FROM TableName

Para la edad en años de uso:

SELECT *, INT((Now()-[Birth Date]) / 365.242199) as AGEYRS from TableName

(tenga en cuenta, CINT redondea, INT no lo hace)

La razón de que esto funciona es que las tiendas de acceder a su fecha / hora en un método similar como Delphi, como un flotador, donde la porción de número entero es el número de días desde que un día específico y la parte fraccional como la parte fraccionaria de que día (0,25 = 06 a.m., 0,50 = mediodía, etc). Por lo tanto, si usted quiere saber las diferencias entre los dos días, acaba de tomar las diferencias entre los números de días ... para el número de años, se divide por el número de días en un año.

Editar

Otra opción aquí sería crear un campo calculado en Delphi y realizar la lógica allí. En su caso onCalculated le codificar algo como lo siguiente:

procedure TForm1.ds1CalcFields(DataSet: TDataSet);
begin
  DataSet.FieldByName('CALCDATE').AsInteger := 
    Trunc((Date - DataSet.FieldByName('BIRTH DATE').AsDateTime) / 365.242199);
end;

Editar

Y, sin embargo un tercer método. En lugar de permitir que la actualización funcione como lo hace actualmente, anular el comportamiento y forzar un cierre / reapertura del conjunto de datos mediante el onClick del navegador:

procedure TForm1.dbnvgr1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
    begin
      ds1.Close;
      ds1.Open;
    end;
end;

Otros consejos

Trate de este parámetro intervalo de cambio:

SELECT *, (DateDiff ('yyyy',[Birth Date], Now())) AS [Age] FROM TableName

Esto es lo que "intervalos" significa:

yyyy    Year
q   Quarter
m   Month
y   Day of Year
d   Day
w   Weekday
ww  Week
h   Hour
n   Minute
s   Second

Me hizo una prueba con su comentario anterior, y también tengo el mismo error.

Creo que es un error en algún lugar del Navegador o en chorro.

Al llegar a refrescar en el NAV. el 40149 se muestra es la representación de la fecha como una doble sin el material calculado. Se parece a usar sólo la primera columna encontramos y para mostrarlo.

Si intenta convertir en una cadena, datos que se sigue una fecha y hora.

Select *, ' ' & DateDiff(.......) as [Age] From table1;

Cuando uso de una columna de cadena tipo o número por primera vez en el campo calculado, el resultado se muestra como debería. Usted puede tratar de:

SELECT *,  mid(id & (DateDiff ('y',[madate], Now())), len(id) + 1) AS [Age] FROM Table1

O:

SELECT *,  (id-id) + (DateDiff ('y',[madate], Now()))  AS [Age] FROM Table1

Esto es bastante feo, pero no el truco ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top