代码之家  ›  专栏  ›  技术社区  ›  shalabh

Case表达式提供“将日期数据类型转换为导致值超出范围的日期时间数据类型。”

  •  0
  • shalabh  · 技术社区  · 4 年前

    将日期数据类型转换为日期时间数据类型导致值超出范围。

    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
    
    2 回复  |  直到 4 年前
        1
  •  0
  •   Dale K    4 年前

    因为 每一个 a的分支 case 必须 返回相同的数据类型。所以你改为 datetime 在第二个分支中,您强制SQL Server尝试将第一个分支转换为 日期时间 也由于 datatype precedence .

    当在第一个分支中,你试图将 date 日期时间 日期时间 可以处理的是 "January 1, 1753"

    日期 日期时间 允许。你在加什么?天?小时?几分钟?使用 dateadd 函数正确添加到

    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
  •  1
  •   Damien_The_Unbeliever    4 年前

    CASE 表达式必须产生一个固定类型的值,不管哪个子句最终匹配。

    datetime 有一个 higher precedence date ,因此是您的 案件

    日期时间 无法存储1753年之前的日期。你的 价值在第一年。

    作为 suggested (至少十年):

    使用 time , 日期 datetime2 datetimeoffset

    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