>source

다음 표와 표 데이터가 있습니다. 그 후 case를 사용하여 select 문을 실행하면 오류가 발생합니다.

The conversion of a date data type to a datetime data type resulted in an out-of-range value.

그러나 두 번째 사례를 언급하면 ​​선택이 잘 작동합니다. 이 문제를 이해하도록 도와주세요.

CREATE TABLE TEST (
ID varchar(20),
T_Date date,
FLAG varchar(20)
);
insert into TEST values('1234', '0001-01-01', NULL);
select t.T_Date, t.FLAG,
CASE
    WHEN t.FLAG IS NULL AND t.T_Date IS NOT NULL AND t.T_Date != '2001-01-01' THEN t.T_Date
    WHEN t.FLAG IS NULL AND (t.T_Date IS NULL OR (t.T_Date IS NOT NULL AND t.T_Date = '2001-01-01')) THEN CONVERT(datetime, '20201216', 112) + 10
END as t_date
FROM TEST t


  • 답변 # 1

    때문에...마다의 지점 case 표현절대로 필요한 것동일한 데이터 유형을 반환합니다. 그래서 당신의 변환과 함께 datetime 두 번째 분기에서는 SQL Server가 첫 번째 분기를 datetime 또한 데이터 유형 우선 순위 때문입니다.

    그리고 첫 번째 브랜치에서 date 값, "0001-01-01", datetime 가장 낮은 값이 datetime 처리 할 수있는 것은 "1753 년 1 월 1 일"입니다.

    또한 10을 추가 할 수 없습니다. date , 당신은 그래도 datetime 허용합니다. 무엇을 추가하고 있습니까? 며칠? 시간? 의사록? 사용 dateadd 에 올바르게 추가하는 기능 date .

    SELECT t.T_Date, t.FLAG,
        CASE
        WHEN t.FLAG IS NULL AND t.T_Date IS NOT NULL AND t.T_Date != '2001-01-01' THEN t.T_Date
        WHEN t.FLAG IS NULL AND (t.T_Date IS NULL OR (t.T_Date IS NOT NULL AND t.T_Date = '2001-01-01')) THEN DATEADD(DAY, 10, CONVERT(DATE, '20201216', 112))
        END AS t_date
    FROM #TEST t
    
    

  • 답변 # 2

    CASE expression은 어떤 절이 일치하는지에 관계없이 하나의 고정 된 유형의 값을 생성해야합니다.

    datetime 우선 순위가 date , 따라서 귀하의 CASE 표현.

    datetime 1753 년 이전의 날짜를 저장할 수 없습니다. date 값은 1 년에 있습니다.

    제안 된대로 (최소 10 년 동안) :

    Use the time , date , datetime2datetimeoffset 새로운 작업을위한 데이터 유형.

    select t.T_Date, t.FLAG,
    CASE
        WHEN t.FLAG IS NULL AND t.T_Date IS NOT NULL AND t.T_Date != '2001-01-01'
           THEN t.T_Date
        WHEN t.FLAG IS NULL AND (t.T_Date IS NULL OR (t.T_Date IS NOT NULL AND t.T_Date = '2001-01-01'))
           THEN CONVERT(date, '20201226', 112)
    END as t_date
    FROM TEST t
    
    

관련 자료

  • 이전 do-while을 C에서 Python으로 변환
  • 다음 build - bazel 360에서 370으로 전환 할 때 @ bazel_tools // tools/android - databinding_exec를 해결하는 방법