2011-09-21 45 views
1

如果日期比數據庫中的記錄日期更早,那麼我想使它們成爲被動的,以便使用更新命令。如何通過在C#中使用單個查詢來執行此操作?如何通過在C#中使用單個查詢來做到這一點?

Colums:Tarih(nvarchar的),硬粒(NVARCHAR)

例如;

if tarih<Datetime.Today.Date is set Durum='PASİF' 

代碼:

string sorgu = "select BitTarihi from Abonelikler"; 
     SqlConnection gg = new SqlConnection(constr); 
     SqlCommand gg2 = new SqlCommand(sorgu,gg); 
     SqlDataReader gg3; 
     gg.Open(); 
     gg3= gg2.ExecuteReader(); 
     while (gg3.Read()) 
     { 
      DateTime b1 = new DateTime(); 
      DateTime b2 = new DateTime(); 
      b1 = Convert.ToDateTime(gg3.GetString(0)); 
      b2 = DateTime.Today.Date; 
      TimeSpan fark = new TimeSpan(); 
      fark = b2 - b1; 
      if (fark.TotalDays > 0) 
      { 
       SqlConnection vv = new SqlConnection(constr); 
       SqlCommand vv2 = new SqlCommand("update Abonelikler set Durum='PASİF' where BitTarihi='" + b1.ToShortDateString() + "'", vv); 
       vv.Open(); 
       vv2.ExecuteNonQuery(); 
       vv.Close(); 
       vv2.Dispose(); 

      } 


     } 
     gg.Close(); 
     gg2.Dispose(); 

回答

1

DATEDIFF功能。

UPDATE Abonelikler SET Durum='PASIF' 
    WHERE DATEDIFF(DD, CONVERT(datetime, BitTarihi), GETDATE())>0 

此外,請不要使用連接的SQL語句,請使用參數。這是更安全的,有時候,語句與參數的連接會阻礙服務器端語句優化。

+0

不DateDiff返回日期邊界差異而不是全天差異? – Tao

+0

@Tao,是,它「返回在指定的startdate和enddate之間交叉的指定日期部分邊界的計數(有符號整數)」。我猜測由於TimeSpan.TotalDays屬性的分數性質,'BitTarihi'不包含時間部分(或者if(fark.TotalDays> 0)'不會正常工作) - 在這種情況下,DATEDIFF返回正是我們想要的,不是嗎? – Dmitry

+0

是的,但你上面的原始僞碼也做了日期邊界檢查,所以這就是你要求的。 – samjudson

1

而不是更新記錄爲什麼你不決定在查詢級別的狀態?既然你每天檢查一下,會有很多不必要的更新。

SELECT BitTarihi, CASE WHEN DATEDIFF(DAY, BitTarihi, GetDate()) = 0 THEN 'AKTIF' ELSE 'PASIF' END DURUM FROM Abonelikler 

這樣你就不必更新記錄。

相關問題