5

W tradycji this question iw świetle the documentation, w jaki sposób można uczynić tę funkcję deterministycznego:Jak dokonać konwersji z varchar na deterministyczny datetime?

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 

albo to jeden (ze względu na ciąg/data literały - i tak, ja też próbowałem „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 

Odpowiedz

6

BOL mówi, że CONVERTjest deterministyczny z datetimes jeśli parametr styl został określony. Więc jeśli zmienić pierwszy UDF:

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

Potem powinny być deterministyczny, jeśli dobrze rozumiem docs.

Można przypuszczać, że ta sama sztuczka może być stosowany w drugim UDF:

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

I naprawdę życzeniem było, aby określić sposób literały datetime w T-SQL.

EDIT:

Jak podkreślił Arvo w komentarzach (dziękuję, Arvo), ODBC datownik dosłowne Format może być używany (nawet przy użyciu OLE DB) tak powyżej druga funkcja może być lepiej napisany jako:

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

a konwersja do datetime odbywa się w czasie kompilacji zamiast czasu wykonania. Należy zauważyć, że format daty musi być bardzo specyficzne (patrz Arvo's link to the datetime data type)

  d         rrrr mm, dd
  t         HH: MM: SS [.fff ]
ts         rrrr-mm-dd gg: mm: ss [.fff]

+0

Używałem tego stylu tylko przy konwersji na varchar - dokumentacja jest niejasna, ale próbowałem ją i wyraźnie działa. –

+0

@P Daddy, Amen na literałach datetime. –

+2

Informacje o literałach datetime - czy nie możesz użyć formatu datownika ODBC, np. {D '1990-10-02'}? Z http://msdn.microsoft.com/en-us/library/ms187819.aspx: Aplikacje korzystające z interfejsów API ADO, OLE DB i ODBC mogą używać formatu datownika ODBC do przedstawiania dat i godzin. – Arvo

2

od artykułów Ci powiązać

Aby być deterministyczny, parametr styl musi być stała. Ponadto style mniejsze lub równe 100 są niedeterministyczne, z wyjątkiem stylów 20 i 21. Style większe niż 100 są deterministyczne, z wyjątkiem stylów 106, 107, 109 i 113.

Musisz użyć parametru stylu w twoich konwersjach do datetime.

Na przykład:

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

wyjątkiem nie używać 121 ...

+0

Więc nie ma literalnych dat jako ciągów w UDF bez bycia CONVERTED? –

+0

Jeśli łańcuchy znaków są konwertowane na daty domyślnie, konwersje te nie mają "stałych" stylów i spowodują, że funkcja będzie niedeterministyczna. –

Powiązane problemy