Fechas en Access y SQL Server

Hola amigos, en esta ocasión aprenderemos como NO EQUIVOCARNOS al manejar fechas en Access y en SQL Server.

Si quieres aprender algo, te recomiendo que leas y no solo copies el código

Problemática:

Cuando desarrollamos una aplicación, todo el trabajo se hace sobre una computadora con ciertas caracteristicas, entre las cuales están el idioma del sistema operativo, tamaño de la pantalla, y por supuesto la configuració regional (en la cual se incluye la fecha).
Cuando programaba en la universidad, solía ocurrir que hacía mis programas en las computadoras de la facultad y los profesores lo revisaban en sus computadoras portátiles, las cuales casi siempre tenian problemas en cuanto al idioma y especialmente las fechas.
Algunos tenían DIA/MES/AÑO, otros MES/DIA/AÑO, y otros AÑO/MES/DIA. Solo ellos saben el por que, pero ese no era su problema sinó mío y me tardé mucho tiempo en averiguar como atacar esa diferencia. Hasta que un día me di cuenta que existe un estándar que manejan Acces y SQL Server, icluso ORACLE lo maneja (aquí no lo tratamos, pero puedes basarte en esto para desarrollarlo).

Estándar Para Access:

Solo basta indicar el mes con letras (en inglés), de esta manera el Access acomoda la fecha, aqui está un ejemplo para 10 de abril de 1981 1pm:

Apr/10/1981 13:00

Estándar para SQL Server

Este es sencillo, lo que hace SQL server es organizar las fechas de ésta manera:

AÑOMESDIA HORAS:MINUTOS:SEGUNDOS:CENTESIMAS

Es decir que si queremos indicar 10 de Abril de 1981 a la 1 de la tarde lo hacemos así:

19810410 13:00:00

A continuación la clase que hace todo sencillo:

using System;

namespace ISODates{
public class Dates{
/// <summary>
/// Devuelve una Fecha ISO para SQLServer
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para SQL Server</returns>
/// <example>10 Abril 1980 10:25 a.m.= 19800410 10:25:00</example>
public static string SQLServerDate(DateTime prmDate){
string varYear = "1900";
string varMonth = "01";
string varDay = "01";
string varHour = "00";
string varMin = "00";
string varSec = "00";
varYear = prmDate.Year.ToString();
varMonth = prmDate.Month.ToString();
if (varMonth.Length == 1){
varMonth = "0" + varMonth;
}
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
varHour = prmDate.Hour.ToString();
if (varHour.Length == 1){
varHour = "0" + varHour;
}
varMin = prmDate.Minute.ToString();
if (varMin.Length == 1){
varMin = "0" + varMin;
}
varSec = prmDate.Second.ToString();
if (varSec.Length == 1){
varSec = "0" + varSec;
}
return (varYear + varMonth + varDay +
" " + varHour + ":" + varMin + ":" + varSec);
}

/// <summary>
/// Devuelve una Fecha ISO para SQLServer
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para SQL Server</returns>
/// <example>10 Abril 1980 = 19800410 00:00:00</example>
public static string SQLServerDateINI(DateTime prmDate){
string varYear = "1900";
string varMonth = "01";
string varDay = "01";
varYear = prmDate.Year.ToString();
varMonth = prmDate.Month.ToString();
if (varMonth.Length == 1){
varMonth = "0" + varMonth;
}
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
return (varYear + varMonth + varDay +
" 00:00:00");
}

/// <summary>
/// Devuelve una Fecha ISO para SQLServer
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para SQL Server</returns>
/// <example>10 Abril 1980 = 19800410 23:59:59</example>
public static string SQLServerDateFIN(DateTime prmDate){
string varYear = "1900";
string varMonth = "01";
string varDay = "01";
varYear = prmDate.Year.ToString();
varMonth = prmDate.Month.ToString();
if (varMonth.Length == 1){
varMonth = "0" + varMonth;
}
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
return (varYear + varMonth + varDay +
" 23:59:59");
}
/// <summary>
/// Devuelve el formato ISO de fechas para MSAccess
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para MSAccess</returns>
/// <example>10 Abril 1980 10:25 a.m.= Apr-10-1980 10:25:00</example>
public static string MSAccessDate(DateTime prmDate){
string[] varMonth ={"Jan","Feb","Mar","Apr",
"May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
string varDay = "01";
string varHour = "00";
string varMin = "00";
string varSec = "00";
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
varHour = prmDate.Hour.ToString();
if (varHour.Length == 1){
varHour = "0" + varHour;
}
varMin = prmDate.Minute.ToString();
if (varMin.Length == 1){
varMin = "0" + varMin;
}
varSec = prmDate.Second.ToString();
if (varSec.Length == 1){
varSec = "0" + varSec;
}
return (varMonth[prmDate.Month - 1] +
"-" + varDay + "-" + prmDate.Year.ToString() +
" " + varHour + ":" + varMin + ":" + varSec);
}

/// <summary>
/// Devuelve el formato ISO de fechas para MSAccess
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para MSAccess</returns>
/// <example>10 Abril 1980= Apr-10-1980 00:00:00</example>
public static string MSAccessDateINI(DateTime prmDate){
string[] varMonth ={"Jan","Feb","Mar","Apr",
"May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
string varDay = "01";
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
return (varMonth[prmDate.Month - 1] +
"-" + varDay + "-" + prmDate.Year.ToString() +
" 00:00:00");
}

/// <summary>
/// Devuelve el formato ISO de fechas para MSAccess
/// </summary>
/// <param name="prmDate">Fecha a convertir</param>
/// <returns>Fecha ISO para MSAccess</returns>
/// <example>10 Abril 1980= Apr-10-1980 23:59:59</example>
public static string MSAccessDateFIN(DateTime prmDate){
string[] varMonth ={"Jan","Feb","Mar","Apr",
"May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
string varDay = "01";
varDay = prmDate.Day.ToString();
if (varDay.Length == 1){
varDay = "0" + varDay;
}
return (varMonth[prmDate.Month - 1] +
"-" + varDay + "-" + prmDate.Year.ToString() +
" 23:59:59");
}
}
}


Utilización:

Una cosulta para ACCESS:

string varSQL = "SELECT * FROM EMPLEADOS WHERE FECHA_NAC =#"+ ISODates.Dates.MSAccessDateINI(dtpFECHA.value) +"#";


Una consulta para SQL Server:

string varSQL = "SELECT * FROM EMPLEADOS WHERE FECHA_NAC ='"+ ISODates.Dates.MSAccessDateINI(dtpFECHA.value) +"'";


Como podemos ver la diferencia es mínima...

Saludos

1 comentario:

  1. Si se está ejecutando a través de cualquier problema de la base de datos de Access, no se preocupe, ya que ahora puede abordarlo fácilmente por su cuenta ¿Quieres saber cómo ...? Entonces echa un vistazo a este enlace útil. El siguiente enlace del sitio contiene información completa sobre la base de datos de acceso y su problema relacionado. Por lo tanto, echa un vistazo a este sitio.

    fuente:
    http://es.accessrepairnrecovery.com

    ResponderEliminar