Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL datetime2无法保存datetime_Sql Server_Datetime2 - Fatal编程技术网

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
value
2021-01-01T10:00:00.267
datetime2(7)
value
2021-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
,因为这是错误的。