我在数据库中有一个待办事项列表。每个项目都有一个待办事项,其中包含应该完成的时间。我想要做的是让我的C#应用程序遍历项目并检查项目是否应该在一小时前完成,在顶部。此外,申请人必须检查该项目是否应在一小时内完成。如果这两个选项中的任何一个为真,则必须向用户显示作业。
我该如何使这项工作?我想到了下面的方法,但是这将显示应该在一小时前完成的任何项目,或更多。我想要的项目应该已经完成,最多1小时前。
foreach (DataRow dr in dsValue.Tables[0].Rows)
{
DateTime dt = Convert.ToDateTime(dr["tijd"]);
if (dt > DateTime.Now.AddHours(-1) || dt < DateTime.Now.AddHours(1))
{
MessageBox.Show(dr["opdracht"].ToString());
}
}
答案 0 :(得分:2)
您的代码几乎可以正常工作 - 您希望这两个条件都成立,而不是其中任何一个,所以快速更改为:
foreach (DataRow dr in dsValue.Tables[0].Rows)
{
DateTime dt = Convert.ToDateTime(dr["tijd"]);
if (dt > DateTime.Now.AddHours(-1) && dt < DateTime.Now.AddHours(1))
{
MessageBox.Show(dr["opdracht"].ToString());
}
}
......就够了。将逻辑移动到数据库可能(更高),或者至少在循环之外的“一小时前”和“一小时的时间”预先计算。
例如,如果您的SQL看起来有点像
DECLARE @HourAgo DATETIME
SET @HourAgo = DATEADD(HOUR,-1,GETDATE())
DECLARE @HoursTime DATETIME
SET @HoursTime = DATEADD(HOUR,1,GETDATE())
SELECT
opdracht,
[other columns]
FROM ExampleTable
WHERE
opdracht BETWEEN @HourAgo AND @HoursTime
答案 1 :(得分:0)
如果您将两个日期差异化,则会获得TimeSpan,您可以查看它包含的天数,小时数,分钟数和秒数。
答案 2 :(得分:0)
有两件事突然袭击我......
这样的时间比较具有内在的风险。例如,考虑如果在夏令时切换之前创建任务会发生什么,并且之后的循环在之后运行。或者,如果计算机的时钟在过渡期间被更改(也许用户意识到它设置错误)。规范化时间(例如,将所有时间戳存储为UTC)将有助于防止这种情况,但它不能完全解决问题,特别是如果在过渡期间更改RTC。
在数据库中进行这种数据选择通常比在客户端进行更好。这意味着,让数据库返回“过期”任务列表,然后在客户端工作。
答案 3 :(得分:0)
这样可行:
if (dt < DateTime.Now && dt > DateTime.Now.AddHours(-1))
{
MessageBox.Show(dr["opdracht"].ToString());
}
答案 4 :(得分:0)
我认为你的比较线应该是:
if (dt >= DateTime.Now.AddHours(-1) && dt <= DateTime.Now)
答案 5 :(得分:0)
您应该使用BETWEEN
运算符过滤数据库中的数据。为此制作了数据库。