BOL говорит, что CONVERT
является детерминированным с датами и временем, если указан параметр style . Так что если вы измените первый UDF на:
RETURN CONVERT(datetime, CONVERT(varchar, @DATA_DT_ID), 112)
Тогда это должно быть детерминированным, если я правильно понимаю документы.
Предположительно, тот же трюк мог бы использоваться во втором UDF:
IF @DateTimeIn < CONVERT(datetime, '1/1/1900', 101)
RETURN CONVERT(datetime, '1/1/1900', 101)
I действительно хотелось бы, чтобы был способ указать литералы даты и времени в T-SQL.
EDIT
Как указал Арво в комментариях ( спасибо , Арво), можно использовать литеральный формат метки времени ODBC (даже при использовании OLE DB), поэтому вторую функцию выше можно было бы записать как
IF @DateTimeIn < {d '1900-01-01'}
RETURN {d '1900-01-01'}
...etc.
и преобразование в datetime выполняется во время компиляции, а не во время выполнения. Обратите внимание, что формат даты должен быть очень конкретным (см. Ссылка Arvo на тип данных datetime ):
д гггг-мм-дд
т чч: мм: сс [.fff]
тс гггг-мм-дд чч: мм: сс [.fff]