【问题标题】:Issue getting weekly birthdays from database at end of the month在月底从数据库中获取每周生日的问题
【发布时间】:2015-02-05 08:42:03
【问题描述】:

我有一个程序每周显示成员的每周生日。这段代码运行良好,直到月底。每当我们到达月底并且当月还剩不到 7 天时,代码就不再列出生日。

我知道这是因为这一周现在跨越两个月,但我已经尝试了所有方法,只是不知道我必须做什么才能解决这个问题。这大概是一个简单的问题。任何帮助将不胜感激。这是我的代码:

public void CheckDayOfWeekAndReturnBirthdaysInDateRange()
    {
        //Check the current day of the week and make calculations according to find out which week to use.
        if (DateTime.Now.DayOfWeek.ToString() == "Sunday")
        {
            DateTime weekStart = DateTime.Now.Date;
            DateTime weekEnd = DateTime.Now.AddDays(7);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Monday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-1);
            DateTime weekEnd = DateTime.Now.AddDays(6);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Tuesday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-2);
            DateTime weekEnd = DateTime.Now.AddDays(5);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Wednesday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-3);
            DateTime weekEnd = DateTime.Now.AddDays(4);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Thursday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-4);
            DateTime weekEnd = DateTime.Now.AddDays(3);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Friday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-5);
            DateTime weekEnd = DateTime.Now.AddDays(2);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
        else if (DateTime.Now.DayOfWeek.ToString() == "Saturday")
        {
            DateTime weekStart = DateTime.Now.AddDays(-6);
            DateTime weekEnd = DateTime.Now.AddDays(1);

            Birthdays = eventsService.ReturnBirthdaysForCurrentWeek(weekStart, weekEnd);
        }
    }

    public void LoadDatagridComponents(DataGridView dataBirthdays)
    {
        dataBirthdays.AutoGenerateColumns = false;
        dataBirthdays.Columns[0].Visible = true;
        dataBirthdays.Columns[1].Visible = true;
        dataBirthdays.Columns[2].Visible = true;

        dataBirthdays.Columns[0].HeaderText = "Name";
        dataBirthdays.Columns[1].HeaderText = "Surname";
        dataBirthdays.Columns[2].HeaderText = "Birthday";

        //Loop through each birthday member and change date of birth to month/day fromat.
        int currentRow = 0;
        foreach (DataGridViewRow row in dataBirthdays.Rows)
        {
            string birthday = Convert.ToDateTime(dataBirthdays.Rows[currentRow].Cells[2].Value).ToString("MMMM dd");
            dataBirthdays.Rows[currentRow].Cells[2].Value = birthday;
            currentRow++;
        }
    }

然后从那里到这里:

public List<Birthdays> ReturnBirthdaysForCurrentWeek(DateTime weekStart, DateTime weekEnd)
    {
        var birthdays = new List<Birthdays>();

        int month = DateTime.Now.Month;
        int dayStartOfWeek = weekStart.Day;
        int dayEndOfWeek = weekEnd.Day;

        using (MySqlConnection Conn = new MySqlConnection(Connect.sConnStr))
        {
            Conn.Open();
            string sSql = "SELECT name, surname, date_birth FROM members WHERE MONTH(date_birth) = " + month + " AND DAY(date_birth) BETWEEN " + dayStartOfWeek + " AND " + dayEndOfWeek + ";";

            MySqlDataReader reader = Connect.getDataCommand(sSql, Conn).ExecuteReader();

            while (reader.Read())
            {
                var birthday = new Birthdays()
                {
                    MemberName = reader["name"].ToString(),
                    MemberSurname = reader["surname"].ToString(),
                    MemberBirthday = reader["date_birth"].ToString()
                };
                birthdays.Add(birthday);
            }

            Conn.Close();
            Conn.Dispose();
        }
        return birthdays;
    }

【问题讨论】:

标签: c#


【解决方案1】:

与其将日期比较逻辑分解为月份和日期比较(有您发现的错误),不如直接比较日期?

例如,这可以通过sql参数来完成:

string sSql = "SELECT name, surname, date_birth FROM members WHERE date_birth BETWEEN @param_val_1 AND @param_val_2";
MySqlCommand command = Connect.getDataCommand(sSql, Conn);
command.Parameters.AddWithValue("@param_val_1", weekStart);
command.Parameters.AddWithValue("@param_val_2", weekEnd);

您还可以简化代码以获得“当前”周以避免所有案例逻辑:

var today = DateTime.Today;
// start with the numbers [0 .. 7)
var startOfWeek = Enumerable.Range(0, count: 7)
    // for each, subtract that many days from today
    .Select(i => today.AddDays(-i))
    // find the first such date that is a Sunday
    .First(dt => dt.DayOfWeek == DayOfWeek.Sunday);
var endOfWeek = startOfWeek.AddDays(6);

根据您存储数据的方式,您可能还需要注意时间组件。 DateTime.Today 为您提供没有时间分量的当前日期(例如,当天的午夜)。但是,如果您的数据库中的日期有其他时间组件,您可能需要调整逻辑来考虑这些因素。

【讨论】:

    猜你喜欢
    • 2018-01-27
    • 2014-08-17
    • 2012-09-22
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多