MySQL日期加减超出支持范围结果不符预期的原因解析
MySQL日期溢出结果不对称的原因解析
MySQL官方文档指出:
MySQL以'YYYY-MM-DD'格式检索和显示DATE值,支持范围为'1000-01-01'至'9999-12-31'。
因此,预期执行以下查询会返回(NULL, NULL):
SELECT DATE_SUB("1000-01-01", INTERVAL 1 DAY), DATE_ADD("9999-12-31", INTERVAL 1 DAY);
但实际返回结果为(0999-12-31, NULL),原因如下:
上下限溢出处理逻辑不对称
MySQL对DATE范围的检查并非完全对称:对上限9999-12-31执行加1天操作时,结果超出文档标注的范围上限,直接返回NULL;但对下限1000-01-01执行减1天操作时,MySQL内部支持处理公元1年至999年的日期,因此会返回有效日期0999-12-31,而非NULL。文档表述的侧重点
官方文档标注的1000-01-01至9999-12-31是推荐的常用有效范围,而非技术层面的绝对边界。MySQL底层存储格式实际上支持更早的日期,只是这类日期属于非推荐使用的场景,未在文档中重点说明。内部存储机制
DATE类型的底层实现允许存储4位年份(包括前补0的999年),因此0999-12-31是符合格式要求的有效日期值,能够被正常检索和显示。
内容的提问来源于stack exchange,提问作者Westy92
相关产品推荐
相关产品推荐

