Éste es una de las cuestiones más recurrentes de este foro (y de muchos otros). A ver si soy capaz de aclararlo de una vez por todas...
Las bases de datos no guardan las fechas con ningún formato. Son las aplicaciones que muestran las fechas almacenadas en la base de datos las que las presentan con algún formato (generalmente, con el formato de fecha/hora de la configuración regional del sistema).
Volveré a decirlo: las bases de datos NO GUARDAN LAS FECHAS CON NINGÚN FORMATO. Las bases de datos almacenan las fechas como números de coma flotante (generalmente, como «Double» de 8 bytes) donde la parte entera significa los días transcurridos desde una fecha "base" y la parte decimal significa los segundos o milisegundos transcurridos desde la medianoche.
Por ejemplo, en SQL Server las fechas se guardan como dos componentes independientes, un componente de fecha y un componente de hora. La fecha se guarda como el número de días anteriores o posteriores a la fecha base del 1 de Enero de 1900. Para los valores de tipo «datetime», la hora se guarda como el número de latidos (ticks) de reloj posteriores a medianoche, donde cada latido representa 3,33 milisegundos, o 1/300 de segundo. Para valores de tipo «smalldatetime», la hora se guarda como el número de minutos posteriores a medianoche.
Para evitar problemas al introducir, modificar o recuperar fechas de la base de datos (mediante sentencias SELECT, UPDATE ó INSERT INTO) sólo hay que usar el formato ISO: 4 dígitos para el año, 2 dígitos para el mes y 2 dígitos para el día (yyyymmdd). Este formato es completamente inequívoco y siempre reconocible por el motor de la base de datos, independientemente de la configuración regional del sistema y del servidor donde reside la base de datos.
Por ejemplo, para Access:
SELECT * FROM Empleados WHERE FechaNacimiento = #2005/12/31#
UPDATE Empleados SET FechaNacimiento = #2005/12/31# WHERE IdEmpleado = 4
INSERT INTO Empleados (Nombre, FechaNacimiento) VALUES ('Pedro García', #2005/12/31#)
Y para SQL Server:
SELECT * FROM Empleados WHERE FechaNacimiento = '20051231'
UPDATE Empleados SET FechaNacimiento = '20051231' WHERE IdEmpleado = 4
INSERT INTO Empleados (Nombre, FechaNacimiento) VALUES ('Pedro García', '20051231')
Un saludo!
Rubén Vigón
Microsoft MVP Visual Basic
http://vigon.mvps.org