如何解决SQL datetime2 不能保存日期时间
在某些情况下,似乎 datetime2
无法保存 datetime
值的值。这是预期的吗?
注意最后两列。还是转换破坏了数据?
SELECT
DATETIMEFROMPARTS (2021,2,28,10,11,12,267),CONVERT(datetime,DATETIMEFROMPARTS (2021,267)),CONVERT(datetime2,CAST(DATETIMEFROMPARTS (2021,267) AS datetime2)
我真的不需要这些转换,但是我在使用实体框架时遇到了问题,即生成 sql 将我的 datetime
转换为 datetime2
,导致将其加载到 C# {{ 1}}
解决方法
您的误解是您认为 datetime
精确到 1/1000 秒;它不是。 .267
不是 .267000
中的 datetime
,而是 .266666~
,因为 datetime
精确到 1/300 秒。
因此,当您将 datetime
转换为精度为 4 或更高的 datetime2
时,将正确表示 1/300 秒。因此 267
表示 datetime
= .2666667
中的 datetime2(7)
。
如果您想要 267
,请使用 datetime2(3)
而不是 datetime2(7)
。
关于 2014 年(及之前的)SQL Server 的注意事项,用于将 .267
错误地转换为 267000
以获取较新的日期和类型数据类型。这在 SQL Server 2016 中已更改。请参阅 Breaking Changes in SQL Server 2016 (13.x)。
DATETIMEFROMPARTS
返回一个 datetime
,它只能精确到 1/300 秒。当您将 datetime
转换为 datetime2(7)
时,小数部分会扩展到 7 的精度。
使用具有所需精度规范的 DATETIME2FROMPARTS
:
SELECT convert(datetime2,DATETIME2FROMPARTS (2021,2,28,10,11,12,267,3));
SELECT convert(datetime2,2670000,7));
CONVERT
在这里是不必要的,除非你想改变结果的精度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。