首页 > 解决方案 > 案例表达式给出“日期数据类型到日期时间数据类型的转换导致超出范围的值”。

问题描述

我有以下表格和表格数据。之后,当我使用案例执行 select 语句时,我收到错误

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

但是当我评论我的第二个案例时,选择工作正常。请帮助我理解这个问题

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

标签: sqlsql-servertsql

解决方案


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

datetime优先级高于date,因此是CASE表达式的类型。

Adatetime无法存储 1753 年之前的日期。您的date值在第 1 年。

正如所建议的(至少十年):

对新工作使用timedate和数据类型。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

推荐阅读