在SQL和C#中昨天找到

这是在论坛中经常出现的东西 - 如何在SQL或C#中找到昨天。一块蛋糕,如果你知道如何,如果你没有,那就狡猾。如果您不清楚要求,则获得合适的价值特别令人棘手。

当前时间(在C#中),因为我键入,是12/07/2010 19:21:36。通过使用这是实现的 安慰.writeline(约会时间。现在); 在一个英国区域设置的盒子上。根据SQL Server的说法,现在是2010-07-12 19:21:36.957。通过执行以下查询来获取: 选择 GetDate.() 。所以我们知道 约会时间。现在GetDate.() 是分别在C#和SQL中获取当前日期和时间的方法。

在C#中,有一个adddays()方法占用整数。整数可能是否定的,因此以下将获得昨天的日期和时间: 安慰.writeline(约会时间.now.adddays(-1));。 SQL具有类似的功能:dateadd()。这需要一个间隔或datePart,因为它们是已知的,一个整数(也可以是负数)和DateTime。可以找到datepart参数的许多接受值,可以找到 这里。要获得与前面的C#代码相同的结果,您只需使用 选择 dateadd.(d - - 1, GetDate.()).

到目前为止很好,如果你需要的只是日期 和时间 24小时前(11/07/2010 19:21:36)。然而,这是摩擦 - 通常,您可能希望从集合或数据库表中获取昨天(或之前的一天)发生的所有事件。如果您要在这样的语句中使用前面的SQL示例:

选择 * FROM Table1 WHERE EventTime < dateadd.(d -   - 1, GetDate.())

您将在昨天19:21:36获取所有物品。在此之后的所有项目都不会被包含在内。也许不是你所期待的。如果您正在查询使用C#对象的集合,则存在相同的问题 约会时间.now.adddays(-1) 作为比较的基础。尝试此示例代码:

var times = new List<约会时间>();
for (var i = 1; i <= 48; i++)
{
  times.Add(约会时间。现在.AddHours(-i));
}


foreach (var t in times.Where(t => t < 约会时间.now.adddays(-1)))
{
  安慰.writeline(t);
}

安慰.ReadLine();

它确实是建立一个清单<DateTime>与物品相隔1小时,从现在开始倒退。但是,它只选择昨天在19:21:36之前的价值的那些物品,这留下了昨天的一些事件仍然没有带有的 - 即19:21:36和午夜之间的活动。

这是令人厌恶的时间部分,所以需要改变到00:00:00或午夜。此前,本文展示了如何用C#执行此操作,直到史蒂夫贡献了他的评论,指出DateTime.now.date确切地说。但是,在SQL中,解决方案是将DateTime更改为字符串:

[C#]
var yesterday = 约会时间。现在.Date;
foreach (var t in times.Where(t => t < yesterday))
{
  安慰.writeline(t);
}
[SQL]
选择 * FROM Table1 WHERE EventTime < CONVERT(varchar(10), GETDATE() , 101)

因为有人曾经说过:希望这有帮助。