0

これが私のシナリオです:

  1. 与えられstartDate = 1/7/2012endDate = 9/7/2012
  2. データベースに含まれるもの:4/7/2012および5/7/2012
  3. データベースに含まれていない間隔で日付を読み取り、返します

期待される結果(DD / MM / YYYY):

1/7/2012
2/7/2012
3/7/2012
6/7/2012
7/7/2012
8/7/2012
9/7/2012

以下は私が使用しているコードです:

DateTime startDate = new DateTime(2012, 7, 1, 0, 0, 0);
DateTime endDate = new DateTime(2012, 7, 9, 0, 0, 0);
int interval = 1;

MySqlConnection connDate = new MySqlConnection(connectionString);
MySqlCommand cmdDate = connDate.CreateCommand();

cmdDate.Parameters.Add("username", MySqlDbType.VarChar);
cmdDate.Parameters["username"].Value = Session["username"].ToString();

cmdDate.CommandText = "SELECT * FROM report WHERE username = @username";

connDate.Open();

MySqlDataReader drDate = cmdDate.ExecuteReader();
this.Label1.Text = "";

for (DateTime dateTime = startDate; dateTime < endDate; dateTime += TimeSpan.FromDays(interval))
{
    //start from here, i don't know exactly what i am doing.
    DateTime reportDate = Convert.ToDateTime(null);
    while (drDate.Read())
    {
        reportDate = Convert.ToDateTime(drDate["reportDate"].ToString());
    }

    if (Convert.ToDateTime(drDate["reportDate"].ToString()).ToShortDateString() != reportDate.ToShortDateString())
    {
        this.Label1.Text += dateTime.ToString() + "</br>";
    }
}
connDate.Close();

問題は、上記のコードは2012年7月1日から9日までのすべての日付を表示することです。代わりに、データベースに既に含まれている7月4日と5日を除くすべての日付を表示したいと思います。

4

2 に答える 2

3

、、および1日の間隔を指定するとstartDate、次のようになります。endDate

// Assumes IEnumerable<DateTime> dbDates;
var remaining =
    Enumerable.Range(0, Int32.MaxValue)
              .Select(day => startDate.AddDays(day))
              .Where(d => d <= endDate)
              .Except(dbDates);

または、おそらくより馴染みのある反復アプローチ:

// Given: HashSet<DateTime> except = new HashSet<DateTime>(dbDates);
for (DateTime date = startDate;
     date <= endDate;
     date = date.AddDays(1))
{
    if (except.Contains(date)) continue;

    // We now have 'date' which is unused in the db
}

GetDateTimeまた、データベースからの取得を支援するために、オーバーロードを使用できます。

// List<DateTime> is another option if you care about order
var dbDates = new HashSet<DateTime>();
while (drDate.Read())
{
    dbDates.Add(drDate.GetDateTime("reportDate"));
}
于 2012-07-12T16:37:23.223 に答える
1

まず、除外する日付の列挙可能リストまたはリスト(データベースからの日付)を作成します。次に、ループを実行して、指定した範囲のすべての日付を取得します。そのループ内で、列挙型に含まれていないすべての日付をラベルに追加する必要があります。

IList<DateTime> exclusionDates = new List<DateTime>();

while (drDates.read())
{
    exclusionDates.Add(Convert.ToDateTime(drDates["reportDate"].ToString()));
}

for (DateTime dateTime = startDate; dateTime < endDate; dateTime += TimeSpan.FromDays(interval))
{
    if (!exclusionDates.Contains(dateTime))
    {
        this.Label1.Text += dateTime.ToString() + "</br>";
    }
}
于 2012-07-12T16:54:06.807 に答える