Pues la verdad si. La mayoria de los gestores de BD no tiene un tipo DATE como el de VFP sino que se manejan con un DATETIME, asi que lo mas sano es evitar el uso de DATE en VFP para asi no tener problemas.
Sin embargo, algo con lo que tienes que tener cuidado, sobre todo en los reportes, es la diferencia fundamental entre un campo DATE y uno DATETIME.
Si tu almacenas la informacion de hora en campo DATETIME y haces algo como esto:
LOCAL dHoy
dHoy = DATE()
SQLEXEC(conn, "SELECT * FROM tabla WHERE fecha = dHoy")
el driver ODBC convertira la fecha 10-04-2012 en el valor '10-04-2012 00:00:00', por lo que el SELECT solo traera aquellos registros donde fecha sea EXACTAMENTE 10-04-2012 00:00:00, dejando POR FUERA transacciones del mismo dia pero con otra ora distinta.
El problema se ve mas claro con un rango de fechas. Digamos que queremos sacar un resumen de ventas del mes:
LOCAL dDesde, dHasta
dDesde = CTOD('01-03-2012')
dHasta = CTOD('31-03-2012')
SQLEXEC(conn, "SELECT SUM(total) FROM facturas WHERE fecha BETWEEN ?dDesde AND ?dHasta")
dado que las fechas se convierten a la hora 00:00:00, el monto total obtenido NO INCLUIRA las facturas hechas el 31-12-2012 DESPUES de las 00:00:00, lo que a todos los efectos practicos significa que no se toman en cuan las ventas del ultimo dia.
La solucion es simple, una vez que estas consciente del problema:
dDesde = DTOT(CTOD('01-03-2012'))
dHasta = DTOT(CTOD('31-12-2012') + 1) - 1
lo que haces es sumarle 1 dia a la fecha hasta (en formato DATE), convertir el valor a DATETIME y luego restarle 1 segundo, con lo que obtienes una fecha que equivale al ultimo dia del mes a las 23:59:59.
El otro punto a tomar en cuenta en el caso de VFP es que algunas bases de datos no soportan directamente el tipo boolean, como es el caso de versiones anteriores de Oracle. Por esto, la politica mas segura es NO manejar campos boolean sino manejarlos o bien como CHAR(1) o como BIT, TINYINT o SMALLINT, usando 0 para falso y 1 para verdadero.
Saludos
Victor Espina