如何显示特定周的数据?

时间:2015-06-01 05:09:32

标签: c# sql sql-server sql-server-2012

我希望通过给出日期来显示特定周的数据,例如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);

错误已解决,现在存在数据问题 例如。如果我将2015-05-27输入tbxStrtDate并进行检索,即使该周内有数据,也不会显示任何数据。

3 个答案:

答案 0 :(得分:0)

你有结帐日期吗

  

tbxStrtDate是2015-05-27

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

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

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

答案 1 :(得分:0)

我认为您的问题与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为weekwkww)或weekdaydw)时,返回值取决于使用{{1}设置的值}}

     

任何一年的1月1日定义星期datepart的起始编号,例如:SET DATEFIRST,其中xxxx是任何年份。

所以你需要SET DATEFIRST

答案 2 :(得分:0)

您的查询完全没问题。

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

你的函数给出了一周= 21 其中Datepart给出周= 22。

因此,您的查询没有匹配结果。

请尝试按照以下步骤计算代码中的@week。它适用于我的测试数据。

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

如果您在周计算中具体说明CalendarWeekRule.FirstFourDayWeek,那么您需要找到相应的SQL等效项。