Ali Kareem Raja
Ali Kareem Raja

Reputation: 576

DateTime comparison in LINQ not returning correct results

I have the following LINQ to query the database and retreive deleted products from a particular date.

 return _myDbEntities.Log
            .Where(p => p.Action.Equals("Deleted") &&
            (p.ActionDate > fromDate))
            .Select(p => new DeletedProduct()
            {
                ProductId = p.ProductId,
                ActionDate = p.ActionDate
            }).ToList();

However, the query is retreiving values like product.ActionDate.Value = {12/8/2016 11:41:00 AM} when the fromDate was fromDate = {12/8/2016 11:41:00 AM}

The query clearly says GREATER THAN. What is happening here?

Upvotes: 5

Views: 1271

Answers (2)

Sefe
Sefe

Reputation: 14007

The DateTime type stores time at much higher precision than seconds. They could be differing at millisecond or even tick (100 nanoseconds) level.

If you want to compare on a higher level, try this:

(p.ActionDate.Ticks / 10000000) > (fromDate.Ticks / 10000000)

Where 10000000 is the number of ticks in a second. Since the /is an integer division that does truncate the fraction, you turn ticks into full seconds.

UPDATE:

It seems like you are using entity framework. The comparison above will possibly not work there. The solution is to run your original query against the database, do a ToList and then filter the results again in a LINQ2Objects query using the logic above.

Upvotes: 0

krillgar
krillgar

Reputation: 12805

There are fractions of a second to each of your properties. Most likely, your record wasn't created at an exact second, whereas any user-created time would be set as such.

Another possibility is the difference between datetime and datetime2 in SQL Server.

Upvotes: 3

Related Questions