Thắc Mắc Về Định Dạng Ngày Tháng Khi Truy Xuất SQL Access Từ VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

thetaihh

Thành viên mới
Tham gia
7/12/20
Bài viết
7
Được thích
0
Em đang thử tạo file Access để lưu dữ liệu khi nhập bằng Excell
- khi em dùng INSERT INTO thì định dạng ngày (dd/MM/yyyy) từ excell vào access bình thường
- khi dùng SELECT với điều kiện ngày như trên (cùng một biến) thì Access lại tra kết quả ngược lại ( MM/dd/yyyy)
mọi người ai biết cách xử lý chỉ giúp em với ạ
viết hơi lủng củng ace thông cảm!
Mã:
Sub Test()
Dim Ngay As Date
Ngay = DateSerial(2023, 2, 8)

If sCon.State = 0 Then
    With sCon
        .Provider = "Microsoft.ACE.OLEDB.12.0"
    End With
    strCon = "D:\NHAP LIEU\SL 2023\Database.accdb"
    sCon.Open strCon
End If

strRec = "INSERT INTO [TieuHaoX2] (Ngay) VALUES (#" & Ngay & "#)"
sRec.Open strRec, sCon
strRec = "SELECT * FROM [TieuHaoX2] WHERE Ngay = #" & Ngay & "#"
sRec.Open strRec, sCon
MsgBox Ngay & " - " & sRec!Ngay
sRec.Close

End Sub

kết quả là

screenshot_1679908190.png
 
MS có nói dùng dan ký hiệu (#) vuwtsv taqts kieur ngày thì phải coi chngf nó mặc định dạng ngày của Mẽo (mmddyyyy).

Khi truy ván ngày với SQL thì cách dễ nhấy và an toianf nhất là format date thành string:
Where Format(ngay, "yyyymmdd") >= "20230327"
Trong mấy cái CSDL thứ dữ thì chúng có cách ưu hóa câu lệnh.
Cỡ hạng thấp như Access thì dùng hàm Foarmat cho mỗi dòng cũng khá meeth nên có thể dùng hàm DateSerial tình mọt lần thôi.
Where ngay >= DateSerial(y, m, d)
Lưu ý là ở đây so sánh với >= cho nên khong cần để ý lắm. Nếu so sánh =, <= mà ngay có chứa giờ thì phức tạp hơn. Đó là tại sao cách thứ nhất an toàn hơn.
 
Upvote 0
MS có nói dùng dan ký hiệu (#) vuwtsv taqts kieur ngày thì phải coi chngf nó mặc định dạng ngày của Mẽo (mmddyyyy).
Chính xác như bác Vetmini nói. Trong Access xử lý tham số dạng ngày phải đưa về dạng #mm\/dd\/yyyy#

Mã:
Public Const conJetDate = "\#mm\/dd\/yyyy\#"

..... & Format (Ngay,conJetDate)...
 
Upvote 0
MS có nói dùng dan ký hiệu (#) vuwtsv taqts kieur ngày thì phải coi chngf nó mặc định dạng ngày của Mẽo (mmddyyyy).

Khi truy ván ngày với SQL thì cách dễ nhấy và an toianf nhất là format date thành string:
Where Format(ngay, "yyyymmdd") >= "20230327"
Trong mấy cái CSDL thứ dữ thì chúng có cách ưu hóa câu lệnh.
Cỡ hạng thấp như Access thì dùng hàm Foarmat cho mỗi dòng cũng khá meeth nên có thể dùng hàm DateSerial tình mọt lần thôi.
Where ngay >= DateSerial(y, m, d)
Lưu ý là ở đây so sánh với >= cho nên khong cần để ý lắm. Nếu so sánh =, <= mà ngay có chứa giờ thì phức tạp hơn. Đó là tại sao cách thứ nhất an toàn hơn.

MS có nói dùng dan ký hiệu (#) vuwtsv taqts kieur ngày thì phải coi chngf nó mặc định dạng ngày của Mẽo (mmddyyyy).

Khi truy ván ngày với SQL thì cách dễ nhấy và an toianf nhất là format date thành string:
Where Format(ngay, "yyyymmdd") >= "20230327"
Trong mấy cái CSDL thứ dữ thì chúng có cách ưu hóa câu lệnh.
Cỡ hạng thấp như Access thì dùng hàm Foarmat cho mỗi dòng cũng khá meeth nên có thể dùng hàm DateSerial tình mọt lần thôi.
Where ngay >= DateSerial(y, m, d)
Lưu ý là ở đây so sánh với >= cho nên khong cần để ý lắm. Nếu so sánh =, <= mà ngay có chứa giờ thì phức tạp hơn. Đó là tại sao cách thứ nhất an toàn hơn.
Thanks bác, nhưng em vẫn thắc mắc sao lúc INSERT thì nó lại hiểu thành dd/mm/yyyy ạ
 
Upvote 0
Thanks bác, nhưng em vẫn thắc mắc sao lúc INSERT thì nó lại hiểu thành dd/mm/yyyy ạ
Khi bạn Insert thì VBA cứ dùng cái định dạng ngày hệ thống mà chèn vào. Chỉ khi truy vấn theo tham số ngày thì phải chuyển mm/dd/yyyy để VBA nó đối chiếu với CSDL mà lấy ra.
 
Upvote 0
Khi bạn Insert thì VBA cứ dùng cái định dạng ngày hệ thống mà chèn vào. Chỉ khi truy vấn theo tham số ngày thì phải chuyển mm/dd/yyyy để VBA nó đối chiếu với CSDL mà lấy ra.
Ý em là khi em nhập ngày 08/02/2023 thì vào access nó là ngày 08/02/2023
nhưng khi e truy vấn ngày 08/02/2023 thì nó vẫn lấy các giá trị của bản ghi ngày 08/02/2023 nhưng sang đến VBA thì VBA lại hiểu là bản ghi ngày 02/08/2023
còn nếu UPDATE bằng tham số ngày 08/02/2023 thì nó lại UPDATE bản ghi của ngày 02/08/2023
( với ngày > 12 thì mọi thứ làm việc bình thường)
Vì thế nên khi em truy vấn để kiểm tra dữ liệu đã tồn tại chưa và lựa chọn UPDATE hoặc INSERT thì bị nhầm dữ liệu
có cách nào cài đặt lại access, excel hay windown để đồng bộ lại không bác
Vì nếu format như cách 1 của bài #2 thì lúc truy vấn so sánh thời gian sẽ khó còn cách 2 nếu gặp ngày > 12 lúc đổi lại nó thành tháng nó sẽ chuyển sang ngày của năm khác chứ không đúng
 
Upvote 0
Tôi kỳ thị người Việt dùng tiếng Tây trong lúc giao thiệp. cho nên tôi chấm dứt hiện diện của mình tại đây.
 
Upvote 0
có cách nào cài đặt lại access, excel hay windown để đồng bộ lại không bác
Vì nếu format như cách 1 của bài #2 thì lúc truy vấn so sánh thời gian sẽ khó còn cách 2 nếu gặp ngày > 12 lúc đổi lại nó thành tháng nó sẽ chuyển sang ngày của năm khác chứ không đúng
Phần lớn cách thành viên trên đây không thích dùng tiếng Tây xem lẫn tiếng Việt (ngoại trừ các từ chuyên ngành) và viết tắt. Cảm ơn thì nói cảm ơn luôn chứ đừng "thanks".
Về vấn đề ngày tháng trong Access, bạn đừng phức tạp hóa nó. Chia vấn đề thành 2 phần: phần nhập liệu và phần code xử lý.
- Nhập liệu: bạn cứ nhập ngày tháng theo đúng định dạng đã thiết lập trong hệ thống của mỗi máy. (Phải nhập theo đúng định dạng ngày hệ thống).
- Phần code xử lý: khi truyền tham số dạng ngày lấy từ Form, Table thì cứ dùng thêm hàm Format (Ngay, conJetDate) như đã nói trên là xong thôi.
Chỉ vậy thôi, không cần cài đặt gì cả.
Cũng có trường hợp tôi muốn thiết lập lại ngày hệ thống và dấu phân cách hàng ngàn trên các máy cài ứng dụng của tôi thì tôi thêm phần code thay đổi ngày hệ thống. Trường hợp này cũng ít vì tôi không muốn can thiệp thay đổi thiết lập cá nhân của họ.
 
Upvote 0
Ngày tháng trong Data.accdb nó theo hệ thống khi ta thay đổi trong hệ thống của máy tính thì nó chạy theo

Thử vậy xong lấy lên là biết thôi

Mã:
KH.AddNew
KH.Fields(1) = Time
KH.Fields(2) = Date
KH.Update

Excel kết hợp với Access lưu trữ dữ liệu là 1 giải pháp hoàn hảo và dễ thực hiện nhất
 
Upvote 0
Phần lớn cách thành viên trên đây không thích dùng tiếng Tây xem lẫn tiếng Việt (ngoại trừ các từ chuyên ngành) và viết tắt. Cảm ơn thì nói cảm ơn luôn chứ đừng "thanks".
Về vấn đề ngày tháng trong Access, bạn đừng phức tạp hóa nó. Chia vấn đề thành 2 phần: phần nhập liệu và phần code xử lý.
- Nhập liệu: bạn cứ nhập ngày tháng theo đúng định dạng đã thiết lập trong hệ thống của mỗi máy. (Phải nhập theo đúng định dạng ngày hệ thống).
- Phần code xử lý: khi truyền tham số dạng ngày lấy từ Form, Table thì cứ dùng thêm hàm Format (Ngay, conJetDate) như đã nói trên là xong thôi.
Chỉ vậy thôi, không cần cài đặt gì cả.
Cũng có trường hợp tôi muốn thiết lập lại ngày hệ thống và dấu phân cách hàng ngàn trên các máy cài ứng dụng của tôi thì tôi thêm phần code thay đổi ngày hệ thống. Trường hợp này cũng ít vì tôi không muốn can thiệp thay đổi thiết lập cá nhân của họ.
cảm ơn bác đã nhắc nhở. em mới tham gia nên chưa biết mong các bác thông cảm
Em bị mắc khi em cập nhật dữ liệu để kiểm tra thông tin nhập có hợp lệ không sau đo mới cho nhập nên khó tách code ra. Mà nếu để chung thì lại phải phân 2 trường hợp (ngày<12 và ngày > 12 để xử lý)
-Trong phần nhập liệu em không có vấn đề gì
-Chỉ khi UPDATE và SELECT thì bị lỗi , và chỉ lỗi khi ngày nhỏ hơn 12 ( em lấy ngày làm tham số truy vấn)
-Khi UPDATE: nếu ngày < 12 thì ngày và tháng bị lộn nên cập nhật sai bản ghi. Nếu ngày lớn hơn 12 thì đúng.
-Khi SELECT: nếu ngày < 12 (2/8/2023)thì truy vấn vào đúng bản ghi nhưng khi chỉnh sửa và UpdateBatch lại bản ghi thì nó lại update vào ngày ngược lại(8/2/2023)
-Còn hiển thị ở trong bản Access và Excel của em vẫn đúng định dạng dd/mm/yyyyy. e nghe có vụ định dạng hiển thị và định dạng nhập liệu khác nhau nên hỏi thử ạ.
-Cách của bác em chưa hiểu rõ lắm, nếu có thể bác sửa giúp em đoạn code của em đã gửi được không ạ
P/S : Rất cảm ơn mọi người đã chia sẻ kiến thức và chân thành xin lỗi nếu trong bài viết có gì không đúng ạ
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom