Varchar에서 DateTime 결정 론적으로 전환하는 방법은 무엇입니까?
-
08-07-2019 - |
문제
전통에서 이 질문 그리고 비추어 문서,이 기능을 결정적으로 만드는 방법 :
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을 사용하지 않는 것을 제외하고 ...