微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL datetime2 不能保存日期时间

如何解决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)

enter image description here

我真的不需要这些转换,但是我在使用实体框架时遇到了问题,即生成 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 举报,一经查实,本站将立刻删除。