Pregunta

En la tradición de esta pregunta y a la luz de la documentación , ¿cómo se hace que esta función sea determinista?

ALTER FUNCTION [udf_DateTimeFromDataDtID]
(
    @DATA_DT_ID int -- In form YYYYMMDD
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID))
END

O este (debido a los literales de cadena / fecha, y sí, también probé '1900-01-01'):

ALTER FUNCTION udf_CappedDate
(
    @DateTimeIn datetime
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
    IF @DateTimeIn < '1/1/1900'
        RETURN '1/1/1900'
    ELSE IF @DateTimeIn > '1/1/2100'
        RETURN '1/1/2100'

    RETURN @DateTimeIn
END
¿Fue útil?

Solución

BOL dice que CONVERT es determinista con fechas y horas si se especifica el parámetro style . Entonces, si cambia el primer UDF a:

RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID), 112)

Entonces debería ser determinista, si entiendo los documentos correctamente.

Presumiblemente, el mismo truco podría usarse en su segundo UDF:

IF @DateTimeIn < CONVERT(datetime, '1/1/1900', 101)
    RETURN CONVERT(datetime, '1/1/1900', 101)

I realmente desearía que hubiera una manera de especificar literales de fecha y hora en T-SQL.

EDITAR :

Como lo señaló Arvo en los comentarios ( gracias , Arvo), se puede usar el formato literal de marca de tiempo ODBC (incluso cuando se usa OLE DB) para que la segunda función anterior se pueda escribir mejor como :

IF @DateTimeIn < {d '1900-01-01'}
    RETURN {d '1900-01-01'}
...etc.

y la conversión a datetime se realiza en tiempo de compilación en lugar de tiempo de ejecución. Tenga en cuenta que el formato de la fecha debe ser muy específico (consulte el enlace de Arvo a la fecha y hora tipo de datos ):

  

& nbsp; d & nbsp; & nbsp; & nbsp; & nbsp; aaaa-mm-dd
  & nbsp; t & nbsp; & nbsp; & nbsp; & nbsp; hh: mm: ss [.fff]
  ts & nbsp; & nbsp; & nbsp; & nbsp; aaaa-mm-dd hh: mm: ss [.fff]

Otros consejos

De los artículos que ha vinculado:

  

Para ser determinista, el parámetro de estilo debe ser una constante. Además, los estilos menores o iguales a 100 no son deterministas, excepto los estilos 20 y 21. Los estilos mayores que 100 son deterministas, excepto los estilos 106, 107, 109 y 113.

Debe usar un parámetro de estilo en sus conversiones a fecha y hora.

Por ejemplo:

CONVERT(datetime, '2008-01-01', 121)

Excepto no use 121 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top