문제

전통에서 이 질문 그리고 비추어 문서,이 기능을 결정적으로 만드는 방법 :

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

또는 이것은 (문자열/날짜 리터럴 때문에-그렇습니다. 나는 또한 '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
도움이 되었습니까?

해결책

볼은 그렇게 말합니다 CONVERT ~이다 DateTimes가있는 경우 결정 론적 스타일 매개 변수가 지정되어 있습니다. 따라서 첫 번째 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)

진짜 t-sql에서 dateTime 리터럴을 지정하는 방법이 있었으면 좋겠다.

편집하다:

Arvo가 주석에서 지적한 바와 같이 (감사합니다, Arvo), ODBC 타임 스탬프 리터럴 형식을 사용할 수 있으므로 (OLE DB를 사용하는 경우에도) 위의 두 번째 함수는 다음과 같이 더 잘 작성 될 수 있습니다.

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

데이터 타임으로의 전환은 실행 시간 대신 컴파일 시간에 수행됩니다. 날짜의 형식은 매우 구체적이어야합니다 ( DateTime 데이터 유형에 대한 Arvo의 링크):

d yyyy-mm-dd
T HH : MM : SS [.fff
ts yyyy-mm-dd hh : mm : ss [.fff

다른 팁

링크 된 기사에서 :

결정 론적이 되려면 스타일 매개 변수는 일정해야합니다. 또한 Styles 20 및 21을 제외하고 100보다 적은 스타일은 비 결정적입니다. Styles 106, 107, 109 및 113을 제외하고 100보다 큰 스타일은 결정적입니다.

DateTime으로 변환에서 스타일 매개 변수를 사용해야합니다.

예를 들어:

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

121을 사용하지 않는 것을 제외하고 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top