我希望通过给出日期来显示特定周的数据,例如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
并进行检索,即使该周内有数据,也不会显示任何数据。
答案 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为week
(wk
,ww
)或weekday
(dw
)时,返回值取决于使用{{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等效项。