如何显示特定周的数据
本文关键字:数据 何显示 显示 | 更新日期: 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
.