日期时间有太多小数位

时间:2010-12-06 17:47:43

标签: c# sql sql-server ado.net

我有以下代码:

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转换为   日期时间。

5 个答案:

答案 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)

答案 3 :(得分:1)

http://msdn.microsoft.com/en-us/library/ms186724.aspx

同样来自微软,有多种日期和时间数据类型。一个是datetime2,它提高了准确度和用户定义的小数秒精度。

他们给出了一个示例datetime2,其中包含7位次秒精度。

答案 4 :(得分:0)

看起来客户端机器有些奇怪。不确定它究竟是什么,但当我们搬到另一台机器时,它不再增加那种额外的精度。感谢所有的想法。