ongke0711 > 24-07-15, 12:15 PM
maidinhdan > 24-07-15, 04:16 PM
(24-07-15, 12:15 PM)ongke0711 Đã viết: không sai đâu maidinhdan. Tại trong cái query mình sửa tham số ngày hiện tại để test mà chưa trả lại cho đúng thôi.
Đang để là: ThamNien: ThamNien([ngaythamgia],#01/03/2015#). Làm hú hồn tưởng sai cả dặm luôn.
tieuho828 > 08-05-16, 01:53 PM
(24-07-15, 02:08 AM)ongke0711 Đã viết: Không biết bác maidinhdan có viết nhầm tên hàm không? Mình dùng DateDiff + DateSerial. Code này mình lục lại mấy file trước đây. Do trí nhớ kém nên ghi chú hơi bị nhiều ở các dòng code, nhìn hơi rối chút
Mã PHP:Function ThamNien(NgayBatDau As Date, NgayKetThuc As Date)
' Hàm cho ket qua: X nam, Y tháng, Z ngày
' "Tròn tháng": là sô ngày cua NKT >= sô ngày cua NBD hoac NBD va NKT la ngay cuoi cua thang tuong ung.
' Khac phuc hàm cho ket qua sai doi voi truong hop tháng có 28,29,31 ngày.
Dim Nam As Long, Thang As Long, Ngay As Long
Dim NgayXL As Date, NgayCuoiThang1 As Date, NgayCuoiThang2 As Date
' Cat bo phan thoi gian (time) theo sau NgayBatDau, NgayKetThuc
NgayBatDau = Int(NgayBatDau)
NgayKetThuc = Int(NgayKetThuc)
' Kiem tra xem ngày có hop le không?
If NgayBatDau > NgayKetThuc Then
ThamNien = ""
Exit Function
End If
'#Tìm thông sô NAM truoc, den THANG, den NGAY
' Kiem tra xem có cùng Nam giua 2 ngày can tìm thâm niên
If Year(NgayKetThuc) > Year(NgayBatDau) Then
' Neu khác Nam -> Kiem tra xem Tháng có giong nhau không? -> Neu cùng Tháng
' -> Ktra Ngày de xem dã tròn Nam hay chua du Nam. VD: 2014/7/23 và 2015/7/20 => chua du Nam
If Month(NgayKetThuc) = Month(NgayBatDau) Then
If Day(NgayKetThuc) >= Day(NgayBatDau) Then
Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc)
Else
Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1 'Loai bo truong hop chua tròn NAM, hàm DateDiff 'yyyy" vãn cho gtri = 1
End If
' Truong hop nay chac chan da qua tròn NAM
ElseIf Month(NgayKetThuc) > Month(NgayBatDau) Then
Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc)
' Truong hop nay chua tròn NAM
Else
Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1
End If
' Truong hop nay NAM giong nhau -> chac chan chua tròn NAM
Else
Nam = 0
End If
' Tính xem bao nhiêu THÁNG. Chi lay phan Tháng chua tròn NAM (mod 12).
Thang = (DateDiff("m", DateSerial(Year(NgayBatDau), Month(NgayBatDau), 1), _
DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 1)) + IIf(Day(NgayKetThuc) >= _
Day(NgayBatDau), 0, -1)) Mod 12
' Tính xem bao nhiêu Ngày da qua. Truong hop NKT >= NBD.
If Day(NgayKetThuc) >= Day(NgayBatDau) Then
Ngay = Day(NgayKetThuc) - Day(NgayBatDau)
' Truong hop NKT<NBD -> phai kiem tra ngày cuôi cua Tháng
' NgayCuoiThang1: Ngày cuôi tháng truoc NgayKetThuc
' NgayCuoiThang2: Ngày cuôi cua tháng NgayKetThuc
' NgayXL: Qui ve Tháng truoc cua NKT voi Ngày cua NBD
Else
NgayCuoiThang1 = DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 0)
NgayCuoiThang2 = DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) + 1, 0)
NgayXL = DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) - 1, Day(NgayBatDau))
If NgayCuoiThang2 = NgayKetThuc Then 'NKT la ngày cuoi thang
If Thang = 11 Then
Thang = 0
Nam = Nam + 1
Else
Thang = Thang + 1
End If
Else
Ngay = DateDiff("d", IIf(NgayXL > NgayCuoiThang1, NgayCuoiThang1, NgayXL), NgayKetThuc)
End If
End If
If Nam >= 1 Then
ThamNien = Nam & " nam, " & Thang & " tháng, " & Ngay & " ngày"
Else
If Thang >= 1 Then
ThamNien = Thang & " tháng, " & Ngay & " ngày"
Else
ThamNien = Ngay & " ngày"
End If
End If
End Function
Mượn tạm file .mdb của bạn bvchauthanh làm demo
tieuho828 > 08-05-16, 02:02 PM
maidinhdan > 08-05-16, 03:58 PM
(08-05-16, 02:02 PM)tieuho828 Đã viết: Bạn ongke0711 cũng tính sai rồi.
31/1/2015 đến 8/5/25016 là 1 nam, 3 tháng, 7 ngày
nhưng bạn tính ra [b]1 nam, 3 tháng, 8 ngày[/b]
tieuho828 > 08-05-16, 06:42 PM
(08-05-16, 03:58 PM)maidinhdan Đã viết:Tại mình có bài tập yêu cầu phải tính như vậy nè.(08-05-16, 02:02 PM)tieuho828 Đã viết: Bạn ongke0711 cũng tính sai rồi.
31/1/2015 đến 8/5/25016 là 1 nam, 3 tháng, 7 ngày
nhưng bạn tính ra [b]1 nam, 3 tháng, 8 ngày[/b]
Trả lời: Tuy mình không phải là chủ nhân của Code trên nhưng.
Bạn dùng cách tính nào mà ra: 1 nam, 3 tháng, 7 ngày
Tôi không cần tính cũng nhìn là là .................8 ngày rồi.
Bây giờ bỏ qua cái Năm + tháng đi: Cứ cho hiện tại là ngày 30/4/2016 tức là ngày cuối cùng của tháng 4. Bạn đếm xem đến ngày 8/5/2016 là bao nhiêu ngày?.
Có lẽ bạn nhầm lẫn là ngày 30/4/2016 có 31 ngày chăng, để rồi bạn lấy cái số 1 của 31 làm thành 1 tây của ngày 1/5/2016.
Hàm của bài này đã Test của nhiều thành viên và đã chuẩn xác rồi.
Nếu bạn còn chưa tính được, hãy đem lịch ra đếm bằng tay thử xem.
Ghi chú: Demo hàm chính xác nằm ở bài đầu tiên ( Tác giả: Ongke) và bài thứ 8 ( Tác giả bvchauthanh)
Thân mến!
ongke0711 > 08-05-16, 07:29 PM
tieuho828 > 08-05-16, 08:08 PM
(08-05-16, 07:29 PM)ongke0711 Đã viết: Vấn đề của bài toán này là mượn 1 tháng báo nhiêu ngày? 28, 29, 30, 31? Sao bạn không lấy đúng số ngày của Ngày bắt đầu là 31 ngày để trừ.
maidinhdan > 08-05-16, 09:20 PM
(08-05-16, 08:08 PM)tieuho828 Đã viết: Tại vì người ta yêu cầu vậy bạn ah. Cách tính là như thế đó giúp mình được không? Tháng mượn 30 ngày bạn ah. Tháng nào cũng vậy.