Configuración del Formato de Fechas en SQL SERVER

escrito por Víctor Fernández Portero 16. septiembre 2011 13:28 | Comentarios (6)

 

Aunque lo ideal es encapsular las variables de fecha en parámetros ya formateados en ocasiones (sobretodo en proyectos viejos) te encuentras con algunas consultas con las fechas directamente en string como el típico:

SELECT * FROM Pedidos WHERE FechaPedido >= '30/01/2011'

Es posible que esta consulta funcione correctamente en tu servidor de SQL SERVER local pero al llevarlo a producción te encuentres en ocasiones con el típico error:

La conversión del tipo de datos varchar en datetime produjo un valor fuera de intervalo / The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Este error ocurre cuando el servidor intenta comparar una columna con formato "DateTime" (como es el campo "FechaPedido" de nuestro ejemplo) con un String pasado como parámetro y, al intentar convertirlo se desborda.

¿Por qué ocurre esto? Porque el idioma del servidor le indica que debe interpretar las fechas de otro modo y al convertir el String en Date da un valor incorrecto (lo más clásico es que lo intente convertir en MM/DD/YYYY y como el mes 30 no existe pasa lo que pasa...).

 

Hay varias formas de solucionar este problema aunque, como he dicho al principio del post, lo ideal es pasar la fecha en una variable ya formateada como Date usando tecnologías de acceso a datos como Entity Framework, Linq o con los DataSets de ADO.NET.

 

Como SysAdmin: Modificar la configuración global de idioma del servidor

Si queremos modificar el idioma predeterminado de TODO el servidor para TODAS las bases de datos podemos hacer los siguiente:

Como "sa" y contra "master" ejecutamos lo siguiente:

SP_CONFIGURE 'default language', 5

RECONFIGURE;

Dónde el 5 pasado como parámetro es el idioma "Español" con formato de fecha "dd/mm/yyyy".

Si queremos establecer otro idioma y no sabemos su identificador usad esta consulta:

USE master
SELECT * FROM syslanguages

De este modo todo nuevo login contra el servidor de base de datos usará este idioma por defecto y afectará a toda conversión de fecha que se solicite (como en la SELECT del ejemplo, un DATEDIFF o un DATENAME para obtener el nombre del día o mes).

 

Como SysAdmin: Modificar la configuración de idioma de un login en concreto

Si no queremos cambiar la configuración de idioma de todo el servidor (cosa lógica si hay otras bases de datos funcionando y no queremos modificar su comportamiento) podemos modificar sólo la configuración de idioma de un login en concreto para que cualquier consulta contra cualquier base de datos que lance dicho login utilice el idioma indicado.

La consulta para cambiar el idioma de un login es:

EXEC sp_defaultlanguage 'nombre del login', 'idioma'

Dónde "idioma" es el nombre del idioma que queremos establecer que podemos obtener del campo "name" de la tabla "master.syslanguages" tal y cómo hemos explicado antes.

 

Al igual que con el otro método es necesario que el usuario vuelva a reconectarse para hacer uso de la nueva configuración.

 

Como desarrollador: Establecer el idioma antes de hacer una consulta

Si no tienes más remedio que hacer una consulta pasando fechas como string puedes asegurarte de escoger el formato antes de realizar la consulta. Para ello basta con añadir la siguiente clausula ANTES de hacer la consulta:

SET LANGUAGE 'idioma'

Con lo que podríamos hacer que nuestra consulta de ejemplo funcione siempre en cualquier servidor sea cual sea el idioma del mismo haciendo la consulta así:

SET LANGUAGE 'español';

SELECT * FROM Pedidos WHERE FechaPedido >= '30/01/2011';

De este modo nos aseguramos que la conversión de la fecha siempre sea con formato del idioma "español" que es dd/mm/yyyy

 

Depende del escenario que tengas deberás usar un método u otro aunque, lo siento por repetirme, lo mejor es controlar el formato de la fecha a nivel de aplicación y no ir modificando la configuración del servidor.

 

 

Nos vemos compilando!!

Tags:

Code Snippet | Sql Server

Comentarios (6) -

Miguel
Miguel Perú
19/07/2012 4:14:52 #

Buen aporte. Justo lo que necesitaba. Smile

Responder

cesar david fernandez
cesar david fernandez Colombia
20/08/2012 17:40:11 #

Excelente amigo, por fin logre registrar  datos fecha desde un objeto DateTimePicker Visual Basic .NET al servidor SQL 2008. Busque en demasiadas paginas y la única solución que me sirvió fue la tuya. MUCHAS GRACIAS... Saludos desde Colombia.

Responder

Sandy
Sandy México
14/11/2012 5:06:45 #

Muchas Gracias Smile

Responder

Marlon
Marlon Guatemala
25/02/2013 3:51:02 #

Gracias Me sirvio Mucho ;)

Responder

jose luis
jose luis Chile
04/06/2013 6:01:53 #

Estimado perdón si mi pedido es muy básico, es posible mostrar un ejemplo de como seria la consulta correcta ocupando Entity Framework, Linq o con los DataSets de ADO.NET.

Responder

Froy PM
Froy PM México
10/06/2013 23:20:32 #

Excelente hermano, me salvaste la vida... jeje.

Responder

Agregar comentario

  Country flag

biuquote
  • Comentario
  • Vista previa
Loading

Acerca de...

Mi nombre es Víctor Fernández Portero y soy un amante de la ingeniería del software a la que llevo dedicandome desde el 2002.

Actualmente trabajo como desarrollador web en entornos .NET Avanzis donde tengo la oporturnidad de trabajar con grandes profesionales del sector así como de emplear las últimas metodologías y tecnologías .NET

LinkedIn Twitter @vfportero
Términos y Condiciones protegidos por Terminis

Mi Windows Phone

¡Descarga mis aplicaciones desde el Marketplace para tu Windows Phone!

Echemos Cuentas

Microsoft Tag Echemos Cuentas App

Quizá te puede interesar...

Hosting Recomendado

Durante más de 5 años he trabajado como desarrollador y miembro del soporte técnico de Domitienda por lo que recomiendo encarecidamente sus servicios ya que, no solo ofrecen hosting .NET 4.0 a un precio muy reducido si no que su servicio técnico es excelente y el más rápido del mercado (apenas unas horas en el peor de los casos. Incluido el fin de semana).

Comentarios Recientes

Comment RSS