03
Dic
09

Fechas ANSI para SQL Server

Hace algunos dias me topé con un problema mayúsculo cuando una de mis aplicaciones trató de meter una fecha en un servidor SQL Server 2000 con la distribución de idioma en Ingles

Luego de muchas tazas de café y varias horas de investigación encontré que segun su distribución de idioma, SQL Server toma las fechas de distintas formas, por ejemplo, en ingles las toma en el formato MM/DD/AAA, en español es DD/MM/AAAA, lo que se traduce en que:

en inglés la fecha 01/10/2009 le corresponde al diez de enero de 2009

en español la fecha 01/10/2009 le corresponde al primero de octubre de 2009

el problema fue este:

en español la fecha 30/11/2009 le corresponde al 30 de noviembre de 2009

y en ingles la fecha dispara un error.

La solución que primero se me vino a la mente fue que antes de meter una fecha al servidor se le cambiara el idioma, pero luego pensé que al servidor no le iba a gustar que estuvieran jugando con sus fechas a cada rato, dado que al terminar de ejecutar el SP con la instrucción Sql el servidor vuelve automaticamente a su idioma original, se imaginan 70,000 cambios de idioma del servidor en una hora? yo no.

Entonces pense que debia existir un formato universal de fecha y hora, y bingo, el formato universal que el servidor acepta se llama ANSI y es el siguiente:

20091001 00:00:00 ——>  añomesdia hora:minuto:segundo

y de esta forma no importa si el servidor esta en chino, eslavo o español.

Identificado el problema y determinada la solución procedí a escribir la función en Visual Basic .Net que me convierte fechas en variables DateTime a Strings con las fechas en el formato ANSI (no encontré en .net algo que me las convirtiera así que me lo fabriqué yo)

‘Conversion de la fecha del sistema a fecha ANSI en formato ‘yyyymmdd hh:mm:ss’
‘Dado que las fechas se ingresan igual que los string, devuelve un valor string
‘porque .net no reconoce formato de fecha ANSI, o al menos yo no lo encontré😄.

Public Function ConvertirFecha(ByVal Fecha As DateTime, ByVal FFH As String)
Dim ANSI As String = “”
Dim FANSI As String = “”
Dim FHANSI As String = “”
Dim Año As String
Dim MesI As Integer
Dim Mes As String
Dim DíaI As Integer
Dim Día As String
Dim Hora As String
Dim Minuto As String
Dim Segundo As String
Try
Año = CStr(Fecha.Year)
MesI = CInt(Fecha.Month)
DíaI = CInt(Fecha.Day)
If MesI < 10 Then
Mes = “0” & CStr(MesI)
Else
Mes = CStr(MesI)
End If
If DíaI < 10 Then
Día = “0” & CStr(DíaI)
Else
Día = DíaI
End If
Hora = Fecha.Hour
Minuto = Fecha.Minute
Segundo = Fecha.Second
FANSI = Año & Mes & Día
FHANSI = Año & Mes & Día & ” ” & Hora & “:” & Minuto & “:” & Segundo
If FFH = “F” Then
ANSI = FANSI
ElseIf FFH = “FH” Then
ANSI = FHANSI
End If
Return ANSI
Catch ex As Exception
ANSI = ex.ToString
Return ANSI
End Try
End Function

Los parámetros que pide esta función son : el objeto DateTime contenieno la fecha/fecha y hora que queremos almacenar en el servidor, el segundo parametro da dos opciones, pasar la lerta “F” con el que la función solo formará la cadena de la fecha “20091001“, o pasar “FH” con el que la función formará la cadena de la fecha y hora “20091001 12:00:00”.

Espero que a mas de alguien le sea de utilidad esta pequeña pero útil función ya que para mi fue de gran ayuda…

Saludos, Axl_505.


2 Responses to “Fechas ANSI para SQL Server”


  1. 1 Leo
    diciembre 22, 2009 a las 8:26 am

    Hola,

    Eso que tu hiciste se puede hacer en una sóla línea con la función format… now.tostring(“yyyyMMdd hh:mm:ss”), si mal no recuerdo…

    Saludos!


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: