首页 > 解决方案 > SQL datetime2 不能保存日期时间

问题描述

在某些情况下,似乎 adatetime2不能保存值的datetime值。这是预期的吗?

注意最后 2 列。还是转换损坏了数据?

SELECT
    DATETIMEFROMPARTS (2021, 2, 28, 10, 11, 12, 267),
    CONVERT(datetime, DATETIMEFROMPARTS (2021, 2, 28, 10, 11, 12, 267)),
    CONVERT(datetime2, DATETIMEFROMPARTS (2021, 2, 28, 10, 11, 12, 267)),
    CAST(DATETIMEFROMPARTS (2021, 2, 28, 10, 11, 12, 267) AS datetime2)

在此处输入图像描述

我真的不需要这些转换,但是我遇到了实体框架的问题,即生成 SQL 转换 my datetimeto datetime2,导致在将其加载到 C# 时存在细微差异DateTime

标签: sql-serverdatetime2

解决方案


你的误解是你认为adatetime精确到1/1000秒;它不是.267不在.267000a 中datetime,它是.266666~,因为datetime精确到 1/300 秒。

因此,当您以 4 或更高的精度将 a 转换datetime为 adatetime2时,将正确表示 1/300 秒。因此267对于 a datetime= .2666667in a datetime2(7)

如果您愿意,请267使用 a datetime2(3)not a datetime2(7)

注意 2014(及更早版本)SQL Server 用于错误地转换.267267000较新的日期和类型数据类型。这在 SQL Server 2016 中已更改。请参阅SQL Server 2016 (13.x)中的重大更改。


推荐阅读