【问题标题】:DateTimeOffset resolution in c# and SQL Serverc# 和 SQL Server 中的 DateTimeOffset 分辨率
【发布时间】:2013-08-17 19:14:42
【问题描述】:

文档指出,在 .NET 和 SQL 服务器中,分辨率都是 100ns。

DateTimeOffset 值的时间分量以 100 纳秒为单位,称为滴答声 - C# 准确度 - 100 纳秒 - SQL Server

但是 SQL 似乎删除了最后一位(例如,我试图保存 2013-08-15 09:19:07.2459675 -04:00,而 SQL 保存 2013-08-15 09:19:07.2459670 -04: 00 - 注意最后一位数字的变化。)

这发生在同一台机器上,因此它不依赖于硬件。

并不是说我真的需要这个分辨率,但它让比较日期变得更加困难......我只是好奇。

【问题讨论】:

    标签: c# .net sql-server-2008 datetimeoffset time-precision


    【解决方案1】:

    我会说问题出在你的身上......要显示的小代码:

    namespace Test
    {
        using System;
        using System.Data;
        using System.Data.SqlClient;
        using System.Globalization;
    
        /// <summary>
        /// 
        /// </summary>
        public class Program
        {
            /// <summary>
            /// 
            /// </summary>
            public static void Main()
            {
                // Change the connection string to specify your server. 
                // Probably you won't need an initial catalog because this
                // program uses a temp table
                string connStr = "Integrated Security=True";
    
                // The temp table is called #Temp . It will cease to exist at the end 
                // of the program automatically
                // Two columns, DateTimeOffset and ShortDateTimeOffset
                string query = @"CREATE TABLE #Temp (DateTimeOffset datetimeoffset(7) NOT NULL, ShortDateTimeOffset datetimeoffset(6) NOT NULL);INSERT INTO #Temp VALUES (@DT1, @DT2);SELECT * FROM #Temp";
    
                using (var connection = new SqlConnection(connStr))
                using (var command = new SqlCommand(query, connection))
                {
                    const string dtString = "2013-08-15 09:19:07.2459675 -04:00";
                    const string dtFormat = "yyyy-MM-dd HH:mm:ss.fffffff zzz";
    
                    DateTimeOffset dt = DateTimeOffset.Parse(dtString, CultureInfo.InvariantCulture);
    
                    string dtString2 = dt.ToString(dtFormat, CultureInfo.InvariantCulture);
    
                    Console.WriteLine("Sending          : {0}", dtString2);
    
                    // Just to be sure!
                    if (dtString != dtString2)
                    {
                        throw new Exception("Problem in conversion");
                    }
    
                    command.Parameters.Add("@DT1", SqlDbType.DateTimeOffset).Value = dt;
                    command.Parameters.Add("@DT2", SqlDbType.DateTimeOffset).Value = dt;
    
                    try
                    {
                        connection.Open();
    
                        using (SqlDataReader reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                            {
                                DateTimeOffset dtRec1 = (DateTimeOffset)reader[0];
                                DateTimeOffset dtRec2 = (DateTimeOffset)reader[1];
    
                                string dtRecString1 = dtRec1.ToString(dtFormat, CultureInfo.InvariantCulture);
                                string dtRecString2 = dtRec2.ToString(dtFormat, CultureInfo.InvariantCulture);
    
                                Console.WriteLine("Receiving (long) : {0}", dtRecString1);
                                Console.WriteLine("Receiving (short): {0}", dtRecString2);
    
                                if (dtRec1 != dt)
                                {
                                    throw new Exception("Difference between DateTimeOffset(.NET) and DateTimeOffset(sql)");
                                }
    
                                if (Math.Abs(dtRec2.Ticks - dt.Ticks) > 10)
                                {
                                    throw new Exception("Too much difference between DateTimeOffset(.NET) and DateTimeOffset(6)(sql)");
                                }
    
                                if (reader.Read())
                                {
                                    throw new Exception("Too many rows");
                                }
                            }
                            else
                            {
                                throw new Exception("No rows");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
        }
    }
    

    在我的 sql 上:

    Sending          : 2013-08-15 09:19:07.2459675 -04:00
    Receiving (long) : 2013-08-15 09:19:07.2459675 -04:00
    Receiving (short): 2013-08-15 09:19:07.2459680 -04:00
    

    “短”是DateTimeOffset(6)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 2011-04-07
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多