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周 其中as
Datepart
给出的周数为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
仍然没有区别:)我想这就是我想要的答案。谢谢