(24-06-15, 06:58 PM)Minh Tiên Đã viết: Chào cả nhà !
Tiên đang nghiên cứu ADODB và gặp tình trạng thế này:
Tiên dùng câu Select để lấy các thông tin khoản ngày.
Kết quả:
- Nếu lọc từ ngày 13/05/2015 đến ngày 30/05/2015 thì KQ đúng;
- Nếu lọc từ ngày 01/05/2015 đến ngày 30/05/2015 thì kết quả sai. Hiển thị lọc từ ngày 05/01/2015 đến 30/05/2015.
(Bị hiểu nhầm ngày thành tháng và tháng thành ngày).
Tiên khắc phục dTungay thành format(dTungay,"dd/mm/yyyy") nhưng vẫn ko được.
Nhờ các Pro chỉ giáo cách khắc phục lỗi này !
Câu Tiên dùng:
"Select * from table Where "NgayTim between #" & dTungay & "# And #" & dDenngay & "#"
Cảm ơn nhiều !
Do có sự phức tạp trong cách cư xử với kiểu dữ liệu của các quốc gia khác nhau, có nơi dùng tháng, ngày, năm, có nơi lại ngày, tháng, năm làm chuẩn, việc xây dựng được công cụ đáp ứng được các yêu cầu đó quả là khó.
Biết được sự phức tạp sẽ xảy ra nên chuẩn SQL đã có một tiêu chí ngầm định là đối với câu truy vấn có liên quan đến ngày, chuẩn mặc định chấp nhận trong mọi tình huống áp dụng là tháng/ngày/năm. Tham số truyền vào cho câu truy vấn đó cũng như vậy.
Quay lại tình huống của bạn:
· Nếu bạn để kiểu dữ liệu trường điều kiện là DateTime thì bất kể bạn để định dạng kiểu dd/mm/yyyy máy tính đều hiểu là kiểu DateTime và khi đưa vào truy vấn bạn chỉ cần đặt điều kiện tham số chuẩn DateTime dạng #thang/ngay/năm# là ổn;
· Nếu bạn để dữ liệu trường điều kiện là Text (nhiều bạn hay làm) với chuẩn dd/mm/yyyy thì khi đưa vào Query bạn cần thêm việc chuyển số liệu sang dạng datetime với các hàm như DateSerial, DateValue .. nhưng lưu ý, nếu bạn không đặc tả đâu là ngày, đâu là tháng thì hệ thống tự làm và thường bị sai:
Ví dụ: 01/5/2014 sẽ được hiểu là ngày 5 tháng 1 năm 2014. Nhưng với 15/5/2014 thì nó vẫn hiểu là ngày 15 tháng 5 năm 2014.
Lời giải cho bài toàn này của bạn như sau:
Bước 1: Chuyển tham số ngày từ textbox sang chuẩn đúng tháng/ngày/năm.
Vì bạn đang dùng chuẩn ngày/tháng/năm cho người dùng thấy quen thuộc nên phải xử lý chuỗi đầu vào bằng một hàm nhỏ StringToDate() trong đó hàm này làm việc tách ngày, tháng, năm ra riêng sau đó chuyển thành dạng số liệu Date.
Code ví dụ như sau:
Mã:
Function StringToDate(DateString as String) as Date
'Nhớ dùng chuẩn phân cách là dạng "/" nhé
Dim txtDay as String, txtMonth as string, txtYear as string
Dim xPos1 as long, xPos2 as long
' Lấy vị trí 2 gạch chéo
xPos1=instr(DateString ,"/")
xPos2=instr(DateString ,"/",xPos1+1)
txtDay=Left(DateString,xPos1-1)
txtMonth=Mid(DateString,xPos1+1, xPos2-1)
txtYear=Mid(DateString,xPos2+1)
StringToDate=DateSerial(txtYear,txtMonth,txtDay)
End Function
Bước 2: Sau đó mới gọi đoạn code kêu Query như sau
Mã:
"Select * from table Where "NgayTim between #" & format(StringToDate(dTungay),”mm/dd/yyyy”)
& "# And #" & Format(StringToDate(dDenngay) ,”mm/dd/yyyy”) & "#"
Bạn có thấy phức tạp không?