我有以下代码:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
// set properties on builder (omitted for brevity)
using (SqlConnection connection = new SqlConnection(builder.ToString()))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandType = System.Data.CommandType.Text;
command.CommandText = "SELECT * FROM Employee WHERE WhenHire < @HireDate";
SqlParameter hireDateParameter = new SqlParameter("@HireDate", DateTime.Now);
command.Parameters.Add(hireDateParameter);
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// do stuff
}
}
}
}
在SQL事件探查器中显示为:
exec sp_executesql N'SELECT * FROM Employee WHERE WhenHire < @HireDate',
N'@HireDate datetime',
@HireDate='2010-12-06 11:43:23.573'
如何确定datetime参数的精度?我已经看到它在小数点后有7位数。
exec sp_executesql N'SELECT * FROM Employee WHERE WhenHire < @HireDate',
N'@HireDate datetime',
@HireDate='2010-12-06 11:43:23.5733125'
在这种情况下,语句无法执行此错误:
Msg 8114,Level 16,State 1,Line 1 将数据类型varchar转换为 日期时间。
答案 0 :(得分:3)
Per Microsoft(http://msdn.microsoft.com/en-us/library/ms187819.aspx),T-SQL DateTime类型的准确度为.000,.003或.007毫秒。任何比这更精确的东西都可能导致错误。
除非你真的需要精确到毫秒,否则我会给DateTime.Now一个格式字符串 - 类似“yyyy-MM-dd HH:mm:ss” - 这会给你:
exec sp_executesql N'SELECT * FROM Employee WHERE WhenHire < @HireDate',
N'@HireDate datetime',
@HireDate='2010-12-06 11:43:23'
.NET Framework能够以毫秒为间隔报告七个小数点,因此如果您的源数据来自DateTime.Now,则最多可能会传入七个小数点。
答案 1 :(得分:3)
我建议您确保使用SqlParameter
类型为DateTime
的{{1}} - 请尝试以下代码:
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
// set properties on builder (omitted for brevity)
using (SqlConnection connection = new SqlConnection(builder.ToString()))
using (SqlCommand command = new SqlCommand(connection))
{
command.CommandType = System.Data.CommandType.Text;
command.CommandText = "SELECT * FROM Employee WHERE WhenHire < @HireDate";
// make sure to have a SqlDbType.DateTime parameter!
SqlParameter hireDateParameter = new SqlParameter("@HireDate", SqlDbType.DateTime);
hireDateParameter.Value = DateTime.Now;
command.Parameters.Add(hireDateParameter);
// don't open the connection too early - this is early enough here!
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// do stuff
}
}
}
答案 2 :(得分:3)
看起来这是2008 Profiler中的一个错误:
答案 3 :(得分:1)
http://msdn.microsoft.com/en-us/library/ms186724.aspx
同样来自微软,有多种日期和时间数据类型。一个是datetime2,它提高了准确度和用户定义的小数秒精度。
他们给出了一个示例datetime2,其中包含7位次秒精度。
答案 4 :(得分:0)
看起来客户端机器有些奇怪。不确定它究竟是什么,但当我们搬到另一台机器时,它不再增加那种额外的精度。感谢所有的想法。