Published on

November 26, 2014

Conversión de fechas en SQL Server

¿Alguna vez te has encontrado con una situación en la que las fechas se almacenan como caracteres en un formato extraño? Recientemente, me encontré con una publicación en la que alguien tenía fechas almacenadas como CYYMMDD. Este formato era nuevo para mí y me pareció bastante inusual. La persona estaba buscando una forma de convertir este formato al más común YYYY-MM-DD. En este artículo, exploraremos diferentes enfoques para lograr esta conversión.

Comencemos configurando algunos datos de muestra:

CREATE TABLE RandomDates
(
    myid INT,
    mydate VARCHAR(7)
);

INSERT INTO dbo.RandomDates (myid, mydate)
VALUES (1, '0600102'),
       (2, '1121004'),
       (3, '0920415'),
       (4, '1040611');

En este formato, los datos consisten en 7 caracteres que representan el siglo, año, mes y día. El siglo está codificado, con el valor único que representa:

  • 0 = 1900
  • 1 = 2000

Entonces, en nuestros datos de muestra, tenemos dos fechas en los años 1900 y dos fechas en los años 2000:

  • 2 de enero de 1960
  • 15 de abril de 1992
  • 11 de junio de 2004
  • 4 de octubre de 2012

Ahora, exploremos dos enfoques diferentes para convertir estas fechas.

Enfoque 1: Usando la función CONVERT

Una forma de convertir estas fechas es usando la función CONVERT. Aquí tienes un ejemplo:

SELECT CONVERT(DATETIME, CASE WHEN LEFT(mydate, 1) = '1' THEN '20' ELSE '19' END + RIGHT(mydate, 6), 112)
FROM dbo.RandomDates;

Este enfoque es sencillo y utiliza funciones simples para concatenar las partes necesarias de la fecha. Produce el resultado deseado.

Enfoque 2: Usando la función DATEFROMPARTS

Otro enfoque, que inicialmente me gustó por su capacidad de mantener separadas las partes de la fecha, es usar la función DATEFROMPARTS (disponible en SQL Server 2012 y versiones posteriores). Aquí tienes un ejemplo:

SELECT DATEFROMPARTS(
    CASE WHEN LEFT(mydate, 1) = '0' THEN 1900 ELSE 2000 END + SUBSTRING(mydate, 2, 2),
    SUBSTRING(mydate, 4, 2),
    SUBSTRING(mydate, 6, 2)
)
FROM dbo.RandomDates;

Este enfoque implica más llamadas a funciones, pero nos permite calcular cada parte de la fecha por separado antes de combinarlas usando la función DATEFROMPARTS.

Ahora, comparemos el rendimiento de estos dos enfoques probándolos en un conjunto de datos más grande. Insertaremos varios millones de filas en la tabla RandomDates utilizando un generador de datos y luego ejecutaremos ambos fragmentos de código.

Después de las pruebas, encontramos que el primer enfoque (usando la función CONVERT) requería alrededor de 19,000 lecturas lógicas y tenía un tiempo de ejecución de aproximadamente 9 segundos. Por otro lado, el segundo enfoque (usando la función DATEFROMPARTS) tuvo alrededor de 30,000 lecturas lógicas y tardó aproximadamente 40 segundos en ejecutarse.

Estos resultados se alinean con nuestras expectativas. El primer enfoque es más simple e intuitivo, ya que convierte directamente la fecha concatenando las partes necesarias. En cambio, el segundo enfoque implica ensamblar la fecha a partir de partes separadas, lo que requiere más llamadas a funciones y lleva más tiempo ejecutarse.

En conclusión, al convertir fechas en SQL Server, es importante considerar el formato de los datos y elegir el enfoque más eficiente. En la mayoría de los casos, el uso de funciones incorporadas como CONVERT o DATEFROMPARTS puede simplificar el proceso de conversión y mejorar el rendimiento.

¡Gracias por leer! Mantente atento para más consejos y trucos de SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.