Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
C# 即使我在SQL Server中使用DateTime2,如何避免使用带有DateTime(C)的隐式转换(SqlParameter)来降低精度?_C#_Sql Server - Fatal编程技术网

C# 即使我在SQL Server中使用DateTime2,如何避免使用带有DateTime(C)的隐式转换(SqlParameter)来降低精度?

C# 即使我在SQL Server中使用DateTime2,如何避免使用带有DateTime(C)的隐式转换(SqlParameter)来降低精度?,c#,sql-server,C#,Sql Server,这是我数据库中的“定义”列 我对C中的DateTime和保存到数据库SQL Server中的值有问题 当应用程序发送时:2019-06-1417:10:39.0192950 将以下内容保存到SQL Server中:2019-06-1417:10:39.0200000 当我需要使用以下功能检查数据库中是否已存在该文件时: protected Func<DateTime?, DateTime?, bool> TimeEquals = (x, y) => x.Value.Hou

这是我数据库中的“定义”列

我对C中的DateTime和保存到数据库SQL Server中的值有问题

当应用程序发送时:2019-06-1417:10:39.0192950

将以下内容保存到SQL Server中:2019-06-1417:10:39.0200000

当我需要使用以下功能检查数据库中是否已存在该文件时:

protected Func<DateTime?, DateTime?, bool> TimeEquals = (x, y) => 
  x.Value.Hour == y.Value.Hour 
     && x.Value.Minute == y.Value.Minute
        && x.Value.Second == y.Value.Second && x.Value.Millisecond == y.Value.Millisecond;
我开始有问题失去精度。在处理C和SQL Server之间的日期时,最好的方法是什么

在确定使用DateTime27在数据库中存储数据这一事实之后,接下来的假设自然是,在代码中的某个地方,数据存储在SQL Server的DateTime中

由于将DateTime2置于比DateTime更高的优先级,很明显,它不是SQL内部的隐式转换

这就给我们留下了在c代码和SQL Server代码之间对SQL Server的日期时间进行隐式转换的唯一选项—果然,这里是:

command.Parameters.Add(new SqlParameter(
    parameter.Label,
    parameter.Value
));
这段代码的问题与方法相同——因为我们不提供数据类型,ADO.Net驱动程序必须猜测它——就像本文所写的一样——它猜测错了

将参数添加到命令的正确方法是使用一个add重载,该重载同时接受参数名称和数据类型:

command.Parameters.Add("@ParamName", SqlDbType.DateTime2).Value = CSDateTimeInstance;
由于缺乏上下文,我不确定如何将其合并到代码中,但这是本例的正确解决方案

第一版

在Sql Server中,使用DateTime2。 您可能正在使用精度为1/300秒的DateTime,而 DateTime2的精度为100ns

从页面:

精度四舍五入到.000、.003或.007秒的增量

从页面:

精度,0到7位数,精度为100ns。默认精度为7位

更新

在确定使用DateTime27在数据库中存储数据这一事实之后,接下来的假设自然是,在代码中的某个地方,数据存储在SQL Server的DateTime中

由于将DateTime2置于比DateTime更高的优先级,很明显,它不是SQL内部的隐式转换

这就给我们留下了在c代码和SQL Server代码之间对SQL Server的日期时间进行隐式转换的唯一选项—果然,这里是:

command.Parameters.Add(new SqlParameter(
    parameter.Label,
    parameter.Value
));
这段代码的问题与方法相同——因为我们不提供数据类型,ADO.Net驱动程序必须猜测它——就像本文所写的一样——它猜测错了

将参数添加到命令的正确方法是使用一个add重载,该重载同时接受参数名称和数据类型:

command.Parameters.Add("@ParamName", SqlDbType.DateTime2).Value = CSDateTimeInstance;
由于缺乏上下文,我不确定如何将其合并到代码中,但这是本例的正确解决方案

第一版

在Sql Server中,使用DateTime2。 您可能正在使用精度为1/300秒的DateTime,而 DateTime2的精度为100ns

从页面:

精度四舍五入到.000、.003或.007秒的增量

从页面:

精度,0到7位数,精度为100ns。默认精度为7位


您使用什么类型在sql中存储日期?在表中使用DATETIME2;DATETIME仅精确到三毫秒左右,启动时会出现奇怪的舍入行为。您需要尝试在c代码中将SQL参数类型更改为datetime2,目前,您的参数没有指定类型-可能最好始终这样做,以确保另一个问题肯定是在这种情况下的答案?您使用什么类型在sql中存储日期?在表中使用DATETIME2;DATETIME仅精确到三毫秒左右,启动时会出现奇怪的舍入行为。您需要尝试在c代码中将SQL参数类型更改为datetime2,目前,您的参数没有指定类型-可能最好始终这样做,以确保备选问题肯定是本例的答案?您确定,@flaviofricasco,选择CONVERTdatetime,CONVERTdatetime27,'2019-06-1417:10:39.0192950';返回您所拥有的值。也许您使用的是datetime参数?@Larnu如果开发人员不挑剔,谁会呢?谢谢,在中对其进行了编辑。如果在表中使用DateTime2,这意味着该值存储在c和数据库表之间的某个地方,即SQL Server的DateTime数据类型中。它可能在存储过程中,也可能是隐式转换-您必须检查代码才能确定。从技术上讲,它也可能存储在DATETIME22或其他精度较低的文件中。当字符串值为
要隐式转换为DATETIME2,引擎将选择DATETIME27,而不考虑目标,因此这不会成为问题。我敢打赌,这是一个您不会忘记的教训:-始终为ado.net参数指定数据类型!command.Parameters.Addparameter.Label,SqlDbType.DateTime2.Value=parameter.Value;是您应该使用的代码。您确定吗,@flavio Francisco,选择CONVERTdatetime,CONVERTdatetime27,'2019-06-14 17:10:39.0192950';返回您所拥有的值。也许您使用的是datetime参数?@Larnu如果开发人员不挑剔,谁会呢?谢谢,在中对其进行了编辑。如果在表中使用DateTime2,这意味着该值存储在c和数据库表之间的某个地方,即SQL Server的DateTime数据类型中。它可能在存储过程中,也可能是隐式转换-您必须检查代码才能确定。从技术上讲,它也可能存储在DATETIME22或其他精度较低的文件中。当字符串值被隐式转换为DATETIME2时,引擎将选择DATETIME27,而不管目标是什么,所以这不会成为问题。我敢打赌,这是一个您不会忘记的教训:-始终为ado.net参数指定数据类型!command.Parameters.Addparameter.Label,SqlDbType.DateTime2.Value=parameter.Value;是您应该使用的代码。