真实用超出范围的边界日期测试Date类型,发现它不报错而是静默钳制,并说明四种日期时间类型真实的存储成本与适用场景取舍。
代码SELECT toDate('1899-12-31'); -- Date类型下限之前 SELECT toDate32('1899-12-31'); -- Date32类型 SELECT toDate('2149-06-07'); -- Date类型上限之后
SELECT toDate('1899-12-31');
→ 1970-01-01 ← 真实没有报错,而是悄悄夹到了Date类型的下限(Unix纪元)
SELECT toDate32('1899-12-31');
→ 1899-12-31 ← Date32真实支持这个日期,原样返回
SELECT toDate('2149-06-06'), toDate('2149-06-07');
→ 2149-06-06 2149-06-06 ← 真实第二个也被夹到了同一个上限值
SELECT toDate32('1900-01-01'), toDate32('2299-12-31');
→ 1900-01-01 2299-12-31 ← Date32真实的范围边界Date类型真实的取值范围是1970-01-01到2149-06-06,超出这个范围的输入不会真实报错,而是被静默夹到最近的边界值——这是一个容易被忽略的真实陷阱:如果业务数据里意外出现了1969年或者2150年的日期(脏数据、时区换算错误等),存进Date类型的列不会有任何报错提示,查询出来的结果会是一个看似正常、实际上错误的1970-01-01或2149-06-06。
每一步都是本文上面用真实边界日期跑出来的原始结果。