Почему моя функция SQL недетерминирована, хотя этого быть не должно?

Согласно MS docs DATEADD является детерминированной функцией, поэтому моя функция ниже также должна быть детерминированной:

CREATE FUNCTION [dbo].[Epoch2Date] (@i INT)
RETURNS DATETIME WITH SCHEMABINDING
BEGIN
    RETURN DATEADD(SECOND,@i,'1970-01-01 00:00:00')
END

Но когда я проверяю это с помощью SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[Epoch2Date]'), 'IsDeterministic'), он возвращает 0 (недетерминированный).

  1. Почему он недетерминирован?
  2. Как я могу сделать свою функцию детерминированной?

Существует аналогичный вопрос, но он использует недетерминированную функцию CAST, что здесь не так.


person endo64    schedule 21.02.2021    source источник


Ответы (1)


DATEADD является. Однако неявное преобразование varchar в datetime не. Это особенно плохо, когда формат, который вы используете, неоднозначен для datetime (хотя, по крайней мере, значение будет таким же).

Вам нужно явно преобразовать значение со стилем:

DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))
person Larnu    schedule 21.02.2021
comment
Спасибо! Это решило проблему. Было бы неплохо отметить это на странице документов MS. - person endo64; 22.02.2021
comment
Это, @endo64, в документе, который я цитировал в вопросе, который вы указали. Неявное приведение/преобразование по-прежнему остается приведением/преобразованием. В вашей попытке у вас есть значение строки символов ('1970-01-01 00:00:00'), которое вы неявно преобразуете/преобразуете без стиля в datetime; и это явно определяется как недетерминированное. - person Larnu; 22.02.2021
comment
Я понимаю, я имел в виду, что было бы неплохо отметить, что DATEADD делает неявное преобразование, которое приводит к недетерминированности. - person endo64; 22.02.2021
comment
Если вы считаете, что это не точно, @endo64 , сделайте запрос на перенос документа; хотя я лично думаю, что это покрывает это (неявно :)). - person Larnu; 22.02.2021