簡體   English   中英

如何顯示特定星期的數據?

[英]How to display data from a specific week?

我想通過指定日期顯示特定星期的數據,例如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-05-27

該查詢正在檢查同一年的結帳日期,如果記錄中沒有結帳日期,則將無法正確匹配該日期。

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

這意味着要完全匹配的每個記錄必須具有一個checkindata和一個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是weekwkww )或weekdaydw )時,返回值取決於使用SET DATEFIRST設置的值

每年的1月1日定義星期日期部分的起始數字,例如: DATEPART (wk, 'Jan 1, xxxx') = 1 ,其中xxxx是任何年份。

因此,您需要SET DATEFIRST

您的查詢非常好。

問題是您的c#方法和SQL Server Datepart函數中的“周數計算”不同。

您的函數給出的周數= 21,而Datepart給出的周數= 22。

因此,沒有匹配的結果是您的查詢。

嘗試按照以下@week在您的代碼中計算@week 它與我的測試數據配合使用。

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

如果您在周計算中特定於CalendarWeekRule.FirstFourDayWeek ,則需要查找對應的SQL等效項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM