Sql server SQL datetime2无法保存datetime
在某些情况下,Sql server SQL datetime2无法保存datetime,sql-server,datetime2,Sql Server,Datetime2,在某些情况下,datetime 2似乎无法保存datetime值。这是预期的吗 请注意最后两列。或者是转换破坏了数据 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
datetime 2
似乎无法保存datetime
值。这是预期的吗
请注意最后两列。或者是转换破坏了数据
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将我的
datetime
转换为datetime2
,在将其加载到C#日期时间
时会产生微小的差异,您的误解是您认为日期时间
精确到1/1000秒;它是而不是.267
在日期时间中不是.267000
,而是.266666~
,因为日期时间
精确到1/300秒
因此,如果将datetime
转换为datetime2
,精度为4或更高,则将正确表示1/300秒。因此267
对于datetime
=.2666667
在datetime2(7)
中
如果需要267
,请使用datetime2(3)
而不是datetime2(7)
注意:对于较新的日期和类型数据类型,2014年(及以前版本)SQL Server用于将.267
错误地转换为267000
。SQL Server 2016对此进行了更改。请参阅。DATETIMEFROMPARTS
返回一个datetime
,该值仅精确到1/300秒。当您将日期时间
强制转换为日期时间2(7)
时,分数部分将扩展到精度为7
使用零件的DATETIME2FROMPARTS
和所需的精度规格:
SELECT convert(datetime2, DATETIME2FROMPARTS (2021,2,28,10,11,12,267,3));
SELECT convert(datetime2, DATETIME2FROMPARTS (2021,2,28,10,11,12,2670000,7));
CONVERT
在这里是不必要的,除非您想更改结果的精度。什么意思,它不能保存datetime
的值datetime
精确到1/300秒,datetime 2
可以精确到1/1000000秒。它可以保存datetime
的每一个值以及更多值。是的,这是我所期望的,但我提供的SQL讲述了不同的故事。不是这样,@Stig.Shorter答案-阅读文档。@SMor我已经读过了。但是,如果datetime使用的是基于无限小数(1/300)的精度,那么datetime2应该如何表示呢?(具有相同的精度)好的,谢谢,所以在将datetime转换为datetime2(不特定于精度)时,可能会给您另一个值。事实上,这有点奇怪,因为MS datetime规范说精度“四舍五入到.000、.003或.007秒的增量”。如果是这种情况,它应该完全适合datetime2。“可以给你另一个值”不,它给你精确的值,而不是另一个值。datetime
value2021-01-01T10:00:00.267
和datetime2(7)
value2021-01-01T10:00:00.2666667
是相同的精确值,因为两种数据类型都尽可能精确地表示了2/300秒,@Stig.1/300!=0.003000@Stig。。。。1/300=0.003333333~就像2/600一样,它们是相等的,@Stig。。。这不是争论的话题,这是基础数学。再一次1/300
=0.0033333~
不是0.0030000
(后者是3/1000
)。看来我无法说服你1/300
!=<代码>3/1000
这里,@Stig。我已经解释过,如果你不喜欢这个原因,因为这就是数学和准确性的原理,那么我在这里帮不了你;你的理解有缺陷。我可以向您保证,如果我有值1/3
,并将精度从1个小数点扩展到7,我不会期望0.3000000
,因为这是错误的。