C# 如何显示特定周的数据?
我想通过指定日期来显示特定一周的数据,例如C# 如何显示特定周的数据?,c#,sql,sql-server,sql-server-2012,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 以下是我每周获取数据的数据库管理器代码
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
并检索,则即使在该周内有数据,也不会显示任何数据。您有该数据的结账日期吗
tbxStrtDate为2015年5月27日
查询正在检查签出日期是否为同一年,如果记录没有签出日期,您将无法正确匹配它
AND YEAR(CheckInDate)=@year AND Year(CheckOutDate)=@year";
这意味着要完全匹配的每个记录必须有一个checkindata和一个checkoutdate我认为您的问题与
逻辑运算符优先级
有关:
当一个语句中使用多个逻辑运算符时,首先计算NOT
,然后计算和
,最后计算或
。算术运算符和位运算符在逻辑运算符之前处理
你有这样的东西:
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是任意年份
所以您需要这样做。您的查询非常好 问题在于c#方法中的“周数计算”与SQL server
Datepart
函数的不同
你的函数给出了第21周
其中asDatepart
给出的周数为22
因此,您的查询没有匹配的结果
请尝试在代码中计算@week
。它与我的测试数据一起工作
int num = cul.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
如果您对CalendarWeekRule.FirstFourDayWeek的周内计算有明确的说明,那么您需要找到相应的SQL等效项。您能发布错误吗?@wewewewesthemenance在HotelReport.exe中发生了类型为“System.Data.SqlClient.SqlException”的未处理异常附加信息:附近的语法不正确'。添加
(
在WHERE之后word@cha哦,谢谢看了哈哈。更新了代码。但我想现在有些数据丢失了。例如,我的tbxStrtDate是2015-05-27,即使那周内有数据,也没有显示任何数据。我该如何从那里开始?使用此:DATEPART(week,CheckInDate)=@week
签出日期来自我的数据库,如上图所示。是的,您的样本上有签出日期,但您是否有2015-05-27签出日期的签出数据2015-05-27不是签入或签出日期,它只是我签出数据的日期。或者您的意思是我需要一周中的两个日期,一个是开始周,另一个是开始周是周末吗?因为如果你看我的代码,它会提取周末并将其作为变量num传递到参数中这就是你需要的DATEPART(week,CheckInDate)=@week
您需要捕获一个范围。注意:此答案首先是在您最初使用不同的SQL Server对其进行测试后的一条评论中给出的。它们会产生相同的答案(尽管语法略有变化)选择DATEPART(year,'2015-05-27 17:17:26.147')作为“year”,DATEPART(week,'2015-05-27 17:17:26.147')作为“week”,DATEPART(月,'2015-05-27 17:17:26.147')为“月”,DATEPART(日,'2015-05-27 17:17:26.147')为“日”,DATEPART(Dayof year,'2015-05-27 17:26.147')为“年中之日”,DATEPART(weekday,'2015-05-27 17:17:26.147')为“周中之日”;
生成年中的周-月-月-日-周-周-周-月-周中之日-周中之日-2015 22 527 147 4
仍然没有区别:)我想这就是我想要的答案。谢谢