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
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:
En este ejemplo, se utiliza la función
TRY_CONVERT
en lugar deCONVERT
para manejar valores de fecha no válidos y devolverNULL
en lugar de generar un error. La cláusulaWITH
crea una CTE que convierte los dos campos de fecha aDATETIME
una vez, utilizandoTRY_CONVERT
, y los asigna a nuevas columnasdt1
ydt2
. 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 operadorOR
para verificar los valoresNULL
, ya queNULL
no es igual a nada, incluidos otros valoresNULL
.