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. He escuchado sobre un programa. El ha sido en un sitio con los softwares - reparar archivo mdb. El programa ha terminado mis problemas muy con facilidad y de balde. Todavia sobre este programa mis amigos han estado contento de este utilidad. Ellos han dicho que con ayuda del instrumento ha economizado el tiempo.

    ResponderEliminar