Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [Hỏi] Mọi người giúp đỡ em về phương thức Select trong DataTable với định dạng dd/mm/yyyy

  1. #1
    Ngày gia nhập
    10 2011
    Bài viết
    5

    Mặc định [Hỏi] Mọi người giúp đỡ em về phương thức Select trong DataTable với định dạng dd/mm/yyyy

    Em có 1 DataTable được load từ file Excel với cột đầu tiên là Date kiểu DateTime có 2 trường hợp là dd/mm/yyyy và mm/dd/yyyy.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		1.jpg
Lần xem:	9
Size:		111.0 KB
ID:		54259

    + Với trường hợp mm/dd/yyyy thì em có thể lấy ra dữ liệu từ table theo điều kiện cột Date từ ngày A đến ngày B (điều này e đã làm được)
    + Với trường hợp giờ hệ thống máy tính đổi lại dd/mm/yyyy thì ứng dụng bị lõi với thông báo "String was not recognized as a Valid Date Time".
    Rất mong mọi người giúp đỡ em với code bên dưới

    Code:
    //Xử lý textbox để lấy điều kiện từ ngày tới ngày
    sd = txtDate.Text.Substring(0, 2);//Ngày
    sm = txtDate.Text.Substring(3, 2);//Tháng
    sy = txtDate.Text.Substring(6, 4);//Năm
    
    sdEnd = txtEndDate.Text.Substring(0, 2);//Ngày
    smEnd = txtEndDate.Text.Substring(3, 2);//Tháng
    syEnd = txtEndDate.Text.Substring(6, 4);//Năm
    
    //Chuyển điều kiện thành kiểu dữ liệu DateTime
    DateTime dFrom = DateTime.Parse(sm + "/" + sd + "/" + sy );
    DateTime dEnd = DateTime.Parse(smEnd + "/" + sdEnd + "/" + syEnd );
    
    
    string stringExpression = "Date >=" + " # " + dFrom.ToString() + " # and Date<= # " + dEnd.ToString() + " #";
    DataTable dt = LoadData(Application.StartupPath + "\\BI.xlsx");//Lấy dữ liệu từ file Excel 
    DataRow[] rows = dt.Select(stringExpression);
    DataTable dtNew = rows.CopyToDataTable();
    dataGridView1.DataSource = dtNew; // hiển thị dtNew lên dataGridView đúng yêu cầu từ ngày tới ngày với định dạng giờ hệ thống máy tính mm/dd/yyyy nhưng lại lỗi với dd/mm/yyyy
    Rất biết ơn mọi người giúp đỡ !
    Đã được chỉnh sửa lần cuối bởi minhwoo10 : 20-05-2017 lúc 02:40 PM.

  2. #2
    Ngày gia nhập
    11 2010
    Bài viết
    409

    TH của bạn nếu mình nhập một ngày có định dạng khác cũng sẽ sai
    vd: 1/1/2015 hay 01/5/2015 hay 1/05/2015 đều sai cả đúng ko.
    Bạn có thể cách này ngoài Substring
    Visual C# Code:
    1. string[] sStartTimes = txtStartDate.Text.Split('');
    2. string sStartDay = sStartTimes[0];
    3. string sStartMonth = sStartTimes[1];
    4. string sStartYear = sStartTimes[2];
    5.  
    6. string[] sEndTimes = txtEndDate.Text.Split('');
    7. string sEndDay = sEndTimes[0];
    8. string sEndMonth = sEndTimes[1];
    9. string sEndYear = sEndTimes[2];
    10.  
    11. //MessageBox.Show(" Day: " +s day + "; Month: " + smonth + "; Year: " + syear + " ");

    Theo mình thì bạn nên quy định cho người dùng nhập định dạng đúng đi đã, có thể dùng yyyy-MM-dd (đây là định dạng chuẩn của SQL), khi try vấn convert cột Date lại là được hoặc convert giá trị truyền vào ra Date
    Visual C# Code:
    1. string query = "select * from Excel where DateColumn between DateTime.Pasre(txtStartDate.Text.Trim()) and DateTime.Pasre(txtEndDate.Text.Trim())";
    2. //hoặc
    3. string query = "select * from Excel where Convert(Date, DateColumn) between txtStartDate.Text.Trim() and txtEndDate.Text.Trim() ";//trong TH này các txt của bạn có dạng yyyy-MM-dd (2015-05-16)

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    5

    Dĩ nhiên là điều kiện truyền vào là đúng vì đã có tính ràng buột (khi Debug cũng đã kiểm tra kỹ). Tuy nhiên ứng dụng cho kết quả đúng khi ngày giờ hệ thống máy tính là mm/dd/yyyy, còn nếu đổi ngược lại là dd/mm/yyyy thì báo lỗi, lỗi khi Debug ở dòng: DataTable dtNew = rows.CopyToDataTable();

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    269

    Trích dẫn Nguyên bản được gửi bởi minhwoo10 Xem bài viết
    Dĩ nhiên là điều kiện truyền vào là đúng vì đã có tính ràng buột (khi Debug cũng đã kiểm tra kỹ). Tuy nhiên ứng dụng cho kết quả đúng khi ngày giờ hệ thống máy tính là mm/dd/yyyy, còn nếu đổi ngược lại là dd/mm/yyyy thì báo lỗi, lỗi khi Debug ở dòng: DataTable dtNew = rows.CopyToDataTable();
    Có thể nào xảy ra trường hợp lỗi do dòng trước đó DataRow[] rows = dt.Select(stringExpression); không nhỉ, bạn chụp ảnh khi bị lỗi lên đây xem thử
    Bạn thử "Date >=" + " # " + dFrom.ToString("M/d/yyyy") + " # and Date<= # " + dEnd.ToString("M/d/yyyy") + " #"; chưa
    Đã được chỉnh sửa lần cuối bởi khoaph : 20-05-2017 lúc 09:11 PM.

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    5

    Xác định là điều kiện ngày tháng truyền vào là đúng và đây là chuỗi điều kiện lấy dữ liệu khi Debug có được (từ ngày 10/01/2017 đến 15/02/2017)
    stringExpression="Date >= # 10/01/2017 12:00:00 AM # and Date<= # 15/02/2017 12:00:00 AM #"
    Và DataTable được load từ Excel có cột Date ép kiểu DateTime như hình bên dưới:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		1.jpg
Lần xem:	2
Size:		111.1 KB
ID:		54320

    - - - Nội dung đã được cập nhật ngày 20-05-2017 lúc 10:38 PM - - -

    Hic đã xác nhận được nguyên nhân vì sao, chỉ cần sữa chuỗi điều kiện thành
    string stringExpression = "Date >=" + " '" + dFrom.ToString() + "' and Date <= '" + dEnd.ToString() + "'";
    Thân !

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn