0

データベースから選択した日付 (EndDate のすべてのエントリ) を比較し、今日の日付と比較したいと思います。これをプログラムで行う方法はありますか?日付を抽出して個別に比較したいですか?テーブルのステータスを更新する必要があるため、これが必要です。

string username;
username = HttpContext.Current.User.Identity.Name;
string date = DateTime.Now.ToString("MM/dd/yyyy");
txtDate.Text = date;


SqlConnection conn1 = 
    new SqlConnection("Data Source=mydatasource\\sqlexpress;" 
                     + "Initial Catalog = Suite2; Integrated Security =SSPI");
SqlDataAdapter adapter;
string end;
end = "SELECT EndDate FROM Table_Message WHERE username = '" + username + "'";
adapter = new SqlDataAdapter(end, conn1);
conn1.Open();
DataSet ds = new DataSet();
adapter.Fill(ds);
//Execute the sql command
GridView2.DataSource = ds;
GridView2.DataBind();
conn1.Close();
4

4 に答える 4

1
   end = "UPDATE Table_Message SET message_status=CASE WHEN EndDate>GETDATE() then 'Expired' WHEN StartDate<GETDATE() then 'Pending' else 'Ongoing' END WHERE username = '" + username + "'";
于 2012-09-04T04:46:13.740 に答える
1

コードではなく、そこで比較を行うようにSQLクエリを変更するだけです。

SQLをこれに置き換えます。

end = "SELECT EndDate, " +
      "case when EndDate >= CURRENT_TIMESTAMP then 'Expired' " +
      "when StartDate <= CURRENT_TIMESTAMP then 'Pending' " +
      "else 'NotExpired' " +
      "end " +
      "as MessageStatus " +
      "FROM Table_Message WHERE username = '" + username + "'";

これにより、2つの列が返されます。EndDateの1つと、今日の前後かどうかのもう1つ。

編集

データベース内のテーブルを返すだけでなく、更新したいことに気づきました。その場合、適切な列を更新するためにsqlステートメントを実行してから、それらを選択する必要があります。例えば

 SqlCommand updateDatabase = new SqlCommand();
 updateDatabase.CommandText = "update dbo.Table_Message set Message_Status = case when EndDate >= CURRENT_TIMESTAMP then 'Expired' when StartDate <= CURRENT_TIMESTAMP then 'Pending' else 'NotExpired'";
 updateDatabase.ExecuteNonQuery();

その後、元のクエリSQL文字列から直接ステータスを選択できます

end = "SELECT EndDate, Message_Status " +
      "FROM Table_Message WHERE username = '" + username + "'";

そうは言っても。このようにすべきではないことを強くお勧めします。データベースの現在のステータスのようなものを更新/保存してはいけません。ケースで更新を行うたびに、非常にコストのかかるデータベース操作を行うことになります。それだけでなく、列の意味は1秒ごと、1ミリ秒ごとに変わります。「期限切れ」メッセージとは、実際にはチェックする日によって異なります。この種のデータはデータベースに保存しないでください。どのメッセージが期限切れになっているのか、どのメッセージが毎回期限切れになっていないのかを解釈する必要があります。これは、C#コードで、または最初に提案したようにSQLクエリの一部として実行できます。値が毎秒変化する可能性のある列をデータベースに含めるべきではありません。それが私の意見です。

お役に立てば幸いです。

于 2012-09-04T03:43:07.453 に答える
0

まず、データベースから日付を取得する必要があります。

DateTime dat1 = DateTime.Parse(2003-12-30); 
DateTime dat2 = DateTime.Parse(2004-12-30); 

TimeSpan spanTime=(dat1-dat2);

SpanTimeなどの比較に使用できますspanTime.Days

于 2012-09-04T03:32:16.953 に答える
0

私の意見

全部ならまず。このコードをクライアント側またはサーバー側で使用しますか? datediff 関数を使用して、SQL サーバー クエリの日付を比較することもできます。そうすれば、サーバーとクライアントのクロックが同期されておらず、クライアントで実行する予定がある場合に正確な比較が得られます

于 2012-09-04T03:37:19.760 に答える