es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Guarda una conversión de columna para reutilizar en un SELECT.

Hay un SELECT en un procedimiento almacenado que tiene algunos bloques case-when anidados, y esto aparece unas 5 veces en diferentes bloques or:

CONVERT(DATE, ADJDOH) <= CONVERT(DATE, ADJDOT)

Estos campos pueden tener un valor DATETIME, estar en blanco (una cadena vacía) o ser NULL, o tener un valor inválido, lo cual hace que falle la función CONVERT. ¿Hay alguna manera de convertir estos campos una sola vez y luego poder hacer las comparaciones o verificaciones de nulidad más fácilmente que utilizando la función CONVERT tantas veces?

En el ejemplo siguiente, la fila 4 da un error si la fecha es inválida.

CREATE TABLE repro (
    id int,
    date1 varchar(10),
    date2 varchar(10)
)

INSERT INTO repro values
(1, '12/31/2021', '12/30/2021'),
(2, NULL, '12/14/2021'),
(3, '',''),
(4, '12/30/202', '12/30/2021')

SELECT 
    CONVERT(DATE,date1) as D1,
    CONVERT(DATE,date2) as D2
from repro 
where 
--id = 1
--id = 2
--id = 3
id = 4

drop table repro
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, una forma de simplificar esta comparación y verificación de nulos es usando una subconsulta o una expresión de tabla común (CTE) para convertir estos campos a DATETIME una vez y luego usar ese nuevo campo para la comparación y la verificación de nulos.

    Aquí hay un ejemplo usando una CTE:

    CREATE TABLE repro (
        id int,
        date1 varchar(10),
        date2 varchar(10)
    )
    
    INSERT INTO repro values
    (1, '31/12/2021', '30/12/2021'),
    (2, NULL, '14/12/2021'),
    (3, '',''),
    (4, '30/12/202', '30/12/2021')
    
    WITH fechas_convertidas AS (
        SELECT 
            id,
            TRY_CONVERT(DATETIME, date1) AS dt1,
            TRY_CONVERT(DATETIME, date2) AS dt2
        FROM repro
    )
    SELECT 
        id,
        dt1,
        dt2
    FROM fechas_convertidas
    WHERE 
        dt1 <= dt2 OR dt1 IS NULL OR dt2 IS NULL
    
    DROP TABLE repro
    

    En este ejemplo, se utiliza la función TRY_CONVERT en lugar de CONVERT para manejar valores de fecha no válidos y devolver NULL en lugar de generar un error. La cláusula WITH crea una CTE que convierte los dos campos de fecha a DATETIME una vez, utilizando TRY_CONVERT, y los asigna a nuevas columnas dt1 y dt2. Luego, la consulta principal utiliza los campos convertidos para la comparación y verificación de nulos.

    Tenga en cuenta que en la cláusula WHERE, se utiliza el operador OR para verificar los valores NULL, ya que NULL no es igual a nada, incluidos otros valores NULL.

Comments are closed.