提问人:JCH77 提问时间:8/27/2023 最后编辑:JCH77 更新时间:8/27/2023 访问量:43
为什么最大范围 DATETIME(6) 微秒值为 .499999?
Why maximum range DATETIME(6) microsecond value is .499999?
问:
我需要定义一个日期时间缺少标志值而不是标志。NULL
关于上限值,MySQL手册说:DATETIME(6)
DATETIME 值的范围是“1000-01-01 00:00:00.000000”到“9999-12-31 23:59:59.499999”
你知道为什么最大微秒部分值是而不是更直观吗?.499999
.999999
.999999
似乎得到了适当的支持:
mysql> create temporary table _test (dt datetime(6));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into _test
> values ('9999-12-31 23:59:59.499999'), ('9999-12-31 23:59:59.999998'), ('9999-12-31 23:59:59.999999');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select all dt as i, dt + interval 1 microsecond as f from _test;
+----------------------------+----------------------------+
| i | f |
+----------------------------+----------------------------+
| 9999-12-31 23:59:59.499999 | 9999-12-31 23:59:59.500000 |
| 9999-12-31 23:59:59.999998 | 9999-12-31 23:59:59.999999 |
| 9999-12-31 23:59:59.999999 | NULL |
+----------------------------+----------------------------+
3 rows in set, 1 warning (0.00 sec)
答:
1赞
Stephen C
8/27/2023
#1
我认为理由是,如果您转换为没有小数秒的最接近的日期时间,结果将超出范围。从语义的角度来看,这将是不好的。9999-12-31 23:59:59.500000
无论哪种方式,很明显,限制不仅仅是一个错别字。这一定是经过深思熟虑的设计决定。.499999
.999999 似乎得到了适当的支持
解释测试结果的另一种方法是 MySQL 未正确执行指定的限制。.499999
评论
0赞
JCH77
8/27/2023
是的,THX (+1),给予 ,对其他想法持开放态度select all cast('9999-12-31 23:59:59.500000' as datetime);
NULL
0赞
Stephen C
8/27/2023
我不确定你为什么需要其他想法。(你用 being 来表示标称范围的最后半秒的用例是什么?但是,如果需要表示范围之外的日期时间值,则可以使用一个或多个 s。BIGINT
BIGINT
0赞
CompuChip
8/27/2023
其他想法:添加带有日期时间状态标志(set、missing、missing2)的列。
1赞
Stephen C
8/27/2023
呃......您的用例是什么?坦率地说,我认为为了在范围末尾表示半秒而使您的数据库架构/应用程序变得复杂是没有意义的。
评论