sql - 案例表达式给出“日期数据类型到日期时间数据类型的转换导致超出范围的值”。
问题描述
我有以下表格和表格数据。之后,当我使用案例执行 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
解决方案
CASE
无论哪个子句最终匹配,表达式都必须产生一个固定类型的值。
datetime
的优先级高于date
,因此是CASE
表达式的类型。
Adatetime
无法存储 1753 年之前的日期。您的date
值在第 1 年。
正如所建议的(至少十年):
对新工作使用
time
、date
和数据类型。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
推荐阅读
- c# - VS2017 Directory.Build.props 不加载整个解决方案
- c# - 从数据库计算时间
- swift - 如何在计数器中有一个日期变量更新年份
- java - 如何在 executorCompletionService 中使用 concurrentHashMap?
- loops - 使用循环将代理类型设置为空闲,当处于该状态时将接受代理,如果忙则拒绝
- javascript - Bootstrap 3 工具提示箭头无法正确显示多行消息
- python - Matplotlib;使用不同的轴标签制作不同的子图
- postgresql - 如何在休眠的 nativeQuery 中投射空日期?
- c - 数组不打印?
- sql - 如何通过引荐来源获得广告、点击和浏览的总数