compare two datetime values from SQL Server with c#

后端 未结 9 2131
终归单人心
终归单人心 2021-01-05 20:48

i want to know how compare two datetime values one who is retreived from sql database and the other is the current one with c#

相关标签:
9条回答
  • 2021-01-05 21:37

    Beware when comparing DateTimes generated within C#. The DateTime struct in C# has more precision than the datetime1 type in SQL Server. So if you generate a DateTime in C# (say from DateTime.Now), store it in the database, and retrieve it back, it will most likely be different.

    For instance, the following code:

    using(SqlConnection conn = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
    using(SqlCommand cmd = new SqlCommand("SELECT @d", conn)){
        DateTime now = DateTime.Now;
        cmd.Parameters.Add(new SqlParameter("@d", now));
        conn.Open();
        DateTime then = (DateTime)cmd.ExecuteScalar();
        Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
        Console.WriteLine(then.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
        Console.WriteLine(then - now);
    

    }

    returns the following sample result.

    2009.06.20 12:28:23.6115968
    2009.06.20 12:28:23.6100000
    -00:00:00.0015968
    

    So in this situation, you would want to check that the difference is within a certain epsilon:

    Math.Abs((now - then).TotalMilliseconds) < 3
    

    Note that this is not an issue if you're comparing two datetimes retrieved from the database, or a datetime constructed from components with second or larger granularity.

    See also: this blog post

    1See note about accuracy, where it mentions "Rounded to increments of .000, .003, or .007 seconds"

    0 讨论(0)
  • 2021-01-05 21:38

    Assuming that you want to check that the two DateTimes are equivalent there's this way:

    TimeSpan span = dateTime2 - dateTime1;
    if (span == TimeSpan.Zero)
    {
        // The times are the same
    }
    

    You will need to convert the System.Data.SqlTypes.SqlDateTime to System.DateTime first of course, as echosca points out in his answer.

    Though there should some allowed rounding error (in the millisecond range say), as these are likely to be real-world derived values, as the simple equality wouldn't be good enough. You'd need something like this:

    if (Math.Abs(span.TotalMilliseconds) < 10.0)
    {
        // The times are within the allowed range
    }
    

    If you just want to compare whether one date is before or after another use the DateTime.CompareTo method as others have suggested.

    0 讨论(0)
  • 2021-01-05 21:41

    DateTime struct overrides GreterThen, GreaterThenOrEqual, LesserThen, LesserThenOrEqual operater, Equalty operater.

    DateTime dateTime1, dateTime2;
    dateTime1 = DateTime.Now;
    dateTime2 = //set value from database;
    
    // all this operations are legal
    if(dateTime1 == dateTime2){}
    if(dateTime1 > dateTime2){}
    if(dateTime1 < dateTime2){}
    
    0 讨论(0)
提交回复
热议问题