2011-02-16 247 views
1

我在數據庫中有一個待辦事項列表。每個物品都有一個todo物品,並有時間完成。我想要做的是讓我的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()); 
    } 
} 
+1

一個快速優化,你不想在循環中每次計算DateTime.Now.Add(xxx) – cristobalito 2011-02-16 13:02:49

+7

爲什麼不改變你的SQL使用`BETWEEN`子句? – 2011-02-16 13:03:40

回答

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 
0

如果你比較兩個日期,你會得到一個TimeSpan,你可以檢查它包含多少天,幾小時,幾分鐘和幾秒。

0

兩件事情,我跳出...

  1. 時間比較像這樣的固有的風險。例如,考慮如果任務是在夏令時開關之前創建的,並且之後的循環運行,會發生什麼情況。或者,如果計算機的時鐘在此期間發生了變化(也許用戶意識到設置錯誤)。規範化時間(例如,將所有時間戳存儲爲UTC)將有助於防止這種情況發生,但它不會完全解決問題,特別是如果RTC在此期間發生更改。

  2. 在數據庫中進行這種數據選擇通常比在客戶端更好。意思是,讓數據庫返回一個「過期」任務列表,然後在該客戶端上工作。

0

這會工作:

if (dt < DateTime.Now && dt > DateTime.Now.AddHours(-1)) 
{ 
    MessageBox.Show(dr["opdracht"].ToString()); 
} 
0

我覺得你比較行應該是:

if (dt >= DateTime.Now.AddHours(-1) && dt <= DateTime.Now) 
0

您應該過濾您的數據庫中的數據使用BETWEEN運算符。數據庫是爲此製作的。