Finding Yesterday in SQL and C#

Here's something that comes up often in forums - How To Find Yesterday in SQL or C#. Piece of cake, if you know how, but tricky if you don't. And especially tricky to get the right value if you are not clear on the requirement.

The current time (in C#), as I type, is 12/07/2010 19:21:36. That's achieved by using Console.WriteLine(DateTime.Now); on a box with UK regional settings. According to SQL Server, it's now 2010-07-12 19:21:36.957. That's obtained through executing the following query: SELECT GetDate(). So we know that DateTime.Now and GetDate() are the ways to get the current date and time in C# and SQL respectively.

In C#, there is an AddDays() method that takes an integer. That integer can be negative, so the following will obtain the date and time for yesterday: Console.WriteLine(DateTime.Now.AddDays(-1));. SQL has a similar function: DateAdd(). This takes an interval or datepart as they are known, an integer (which can also be negative) and a datetime. There are a number of accepted values for the datepart argument, which can be found here. To get the same result as the preceding C# code, you would simply use SELECT DATEADD(d, -1, GetDate()).

So far so good, if all you need is the date and time for 24 hours ago (11/07/2010 19:21:36). However, and here's the rub - often, you might want to obtain all events that happened yesterday (or the day before today) from a collection or a database table. If you were to use the preceding SQL example in a statement like this:

SELECT * FROM Table1 WHERE EventTime < DATEADD(d, -1, GetDate())

you will get all items that have an EventTime value before yesterday at 19:21:36. All items that occured after that time will not be included. Not quite what you would expect, maybe. The same problem exists if you are querying a collection of C# objects using DateTime.Now.AddDays(-1) as the basis for the comparison. Try this example code:

var times = new List<DateTime>();
for (var i = 1; i <= 48; i++)
{
  times.Add(DateTime.Now.AddHours(-i));
}


foreach (var t in times.Where(t => t < DateTime.Now.AddDays(-1)))
{
  Console.WriteLine(t);
}

Console.ReadLine();

All it does is build a List<DateTime> with items 1 hour apart, going backwards from now. However, it will only select those items that have a value prior to 19:21:36 yesterday, which leave some events from yesterday still untroubled - ie those between 19:21:36 and midnight.

It's the pesky time part that gets in the way, so that needs to be changed to 00:00:00 or midnight. Previously, this article showed how to do that with C#, until Steve contributed his comment below, pointing out that DateTime.Now.Date gives us exactly that. However, in SQL, the solution is to change the datetime to a string:

[C#]
var yesterday = DateTime.Now.Date;
foreach (var t in times.Where(t => t < yesterday))
{
  Console.WriteLine(t);
}
[SQL]
SELECT * FROM Table1 WHERE EventTime < CONVERT(varchar(10), GETDATE(), 101)

As someone once said: Hope This Helps.

 

Date Posted:
Last Updated:
Posted by:
Total Views to date: 16437

4 Comments

- Mike

Thanks man!, actually used that snippet concept today lol

- Steve

what about:

var yesterday = DateTime.Now.Date;

- Mike

@Steve,

Yes - that will do it :o)

- dotnetcoder

Simple and very informative!
Add your comment

If you have any comments to make about this article, please use this form to do so. Make sure that your comment relates specifically to the article above. More general comments can be posted through the form on the Contact page.

Please note, all comments are moderated, and I end up deleting quite a lot. The kind of things that will ensure your comment is deleted without ever seeing the light of day are as follows:

  • Requests to fix your code (post a question to forums.asp.net instead, please)
  • Gratuitous links to your own site or product
  • Anything abusive or libellous
  • Spam

I do not pass email addresses on to spammers, so a valid one will assist me in responding to you personally if required.

Recent Comments

kawish 4/24/2015 7:04 AM
In response to Using The Themes Helper In Razor Web Pages
Nice:)...

Mahdi 4/23/2015 9:49 PM
In response to Adding a New Row In The Razor WebGrid
Thank u very very. its useful for me...

Jerrie Pelser 4/23/2015 4:24 PM
In response to Entity Framework 6 Recipe: Storing And Managing Time
Nice article Mike! I think there is an error in the House property getter of MovieFormModel. Your...

mike 4/22/2015 4:45 PM
In response to Parameter Queries in ASP.NET with MS Access
If the insert statement got failed how w can i get the error message of as string?...

frank 4/22/2015 9:44 AM
In response to Sessions in ASP.NET 5
Mike can you write up an article showcasing the difference / upgrade paths of ASP.net Web Pages and...

Scott 4/21/2015 11:39 PM
In response to ASP.NET MVC DropDownLists - Multiple Selection and Enum Support
Excellent! Just what I need for the current application I am working on. Even to the extent that I a...

Benjamin 4/21/2015 4:57 AM
In response to Creating a Connection String and Working with SQL Server LocalDB
Hi Mike, great article. I am learning a lot. As commented @Evita, the &lt;Key> Data Annotation is I...

Wayne Hudson 4/20/2015 9:14 PM
In response to Inline Editing With The WebGrid
Thank you very much for your articles. They've helped me a lot. How would you handle inline such...

Dan 4/20/2015 5:01 PM
In response to Sessions in ASP.NET 5
Can I ask how these sort of options are affected by the IIS configuration options when hosted in be...

Shaheen 4/20/2015 3:36 PM
In response to Conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value
Perfect! Saved me from wasting hours....