如何显示特定周的数据

本文关键字:数据 何显示 显示 | 更新日期: 2023-09-27 17:51:22

我想通过给定日期来显示特定周的数据,例如2015-06-01

这是我的表,我想用它来获取星期

BookingID   CheckInDate CheckOutDate
1           2015-05-25  2015-05-31
2           2015-05-26  2015-06-03
3           2015-06-01  2015-06-07
4           2015-06-01  2015-06-12

下面是我的数据库管理器代码,以获得按周的数据:

public static ArrayList GetStatsByWeek(int week, int year)
    {
        SqlConnection conn = new SqlConnection();
        SqlCommand comm = new SqlCommand();
        ArrayList rmCount = new ArrayList();
        try
        {
            conn.ConnectionString = GSM_CONN_STR;
            conn.Open();
            comm.Connection = conn;
            comm.CommandText = "SELECT COUNT(BookingID) as '"TotalCount'" FROM CheckInOut WHERE DATEPART(WEEK,CheckInDate)=@week OR DATEPART(WEEK,CheckOutDate)=@week AND YEAR(CheckInDate)=@year AND Year(CheckOutDate)=@year";
            comm.Parameters.AddWithValue("@week", week);
            comm.Parameters.AddWithValue("@year", year);
            SqlDataReader dr = comm.ExecuteReader();
            while (dr.Read())
            {
                RoomCounts r = new RoomCounts();
                r.TotalCount = (int)dr["TotalCount"];
                rmCount.Add(r);
            }
            dr.Close();
        }
        catch (SqlException e)
        {
            throw e;
        }
        finally
        {
            conn.Close();
        }
        return rmCount;
    }

这是我的代码

DateTime date = Convert.ToDateTime(tbxStrtDate.Text);
        double totalPercentage;
        double totalCount = 0;
        int flr2Count = 0;
        int flr3Count = 0;
        CultureInfo cul = CultureInfo.CurrentCulture;
        int num = cul.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Sunday);
        //Retrieve all the data
        ArrayList rmC = HotelDB.GetStatsByWeek(num, date.Year);

错误解决,现在有一个数据问题。
例如,如果我在tbxStrtDate中输入2015-05-27并检索,即使有该周的数据,也没有显示数据。

如何显示特定周的数据

您的查询非常好。

问题是"周数计算"在你的c#方法和SQL服务器Datepart函数的差异。

函数给出的week = 21where as Datepart gives week = 22.

所以没有匹配的结果是你的查询。

尝试在代码中计算@week。它与我的测试数据有效。

int num = cul.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);

如果您在周计算中指定CalendarWeekRule.FirstFourDayWeek,那么您需要找到相应的SQL等价

您有结账日期吗

tbxStrtDate is 2015-05-27

查询正在检查结帐日期是否为同一年,如果记录没有结帐日期,您将无法正确匹配。

AND YEAR(CheckInDate)=@year AND Year(CheckOutDate)=@year";

这意味着要完美匹配的每条记录必须有checkkindata和checkoutdate

我认为你的问题与Logical Operator Precedence有关:

当语句中使用多个逻辑运算符时,首先求值NOT,然后求值AND,最后求值OR。算术操作符和位操作符在逻辑操作符之前处理。

你有这样的东西:

p OR q AND r AND s

等于

p OR ((q AND r) AND s)

我想你想要:

(((p OR q) AND r) AND s)
-- or
(p OR q) AND r AND s

那么,试试这个:

WHERE 
    (DATEPART(WEEK, CheckInDate) = @week 
  OR DATEPART(WEEK, CheckOutDate) = @week) 
 AND YEAR(CheckInDate) = @year 
 AND YEAR(CheckOutDate) = @year

注意:
当datepart为week (wk, ww)或weekday (dw)时,返回值依赖于使用SET DATEFIRST

设置的值。

任意年份的1月1日定义周日期部分的起始数字,例如:DATEPART (wk, 'Jan 1, xxxx') = 1,其中xxxx表示任意年份。

所以你需要SET DATEFIRST .