• Xác định số ngày từ 2 ngày nhập vào
  • Xác định số ngày từ 2 ngày nhập vào

    haocaocu > 15-08-11, 05:22 PM

    Mình có làm 1 function như sau :
    Ngay360(ByVal Ngaybatdau As Date, ByVal Ngayketthuc As Date, Optional Phuongthuc As Boolean) As Long
    quy tắc tính của hàm này như sau sadGiả sử biến Ngayketthuc là 30/06/2011)
    -Nếu Ngaybatdau là ngày cuối cùng của tháng thì giả sử như sau :
    vd1 :
    Ngaybatdau=28/02/2011 thì tính đến 31/03/2011=30 ngày đến 30/04/2011=60 ngày đến 31/05/2011=90 ngày đến 30/06/2011=120 ngày
    sau đó cộng thêm 1 ngày nữa (vì tính hết ngày 20/06/2011)
    - Neu Ngaybatdau là ngày bình thường :
    vd2:
    Ngaybatdau=13/04/2011 thì tính đến 13/05/2011=30 ngày đến 13/06/2011=60 ngày số ngày còn lại bằng 30-13+1=8 ngày
    Tổng cộng : 68 ngày
    (Thông thường biến Ngayketthuc là ngày cuối của tháng)
    Mình viết rồi nhưng nó không bắt được chặt chẽ các trường hợp. Nhờ các ban viết giúp. Cảm ơn
    Hàm mình viết :
    Trích dẫn:Public Function Ngay360(ByVal Ngaybatdau As Date, ByVal Ngayketthuc As Date, Optional Phuongthuc As Boolean) As Long
    Dim lSothang, lNgaybatdau, lNgayketthuc As Long
    lNgaybatdau = Day(Ngaybatdau)
    lNgayketthuc = Day(Ngayketthuc)
    lSothang = DateDiff("M", Ngaybatdau, Ngayketthuc)
    'If Ngaycuoicuathang(Ngaybatdau) = True Then
    If lNgayketthuc < lNgaybatdau Then
    Ngay360 = (lSothang * 30) + (lNgayketthuc - lNgaybatdau) + 2
    ElseIf Thanghai(Ngaybatdau) = True Then
    Select Case lNgaybatdau
    Case 28
    Ngay360 = (lSothang * 30) + (lNgayketthuc - lNgaybatdau) - 2
    Case 29
    Ngay360 = (lSothang * 30) + (lNgayketthuc - lNgaybatdau) - 1
    End Select
    Else
    Ngay360 = (lSothang * 30) + (lNgayketthuc - lNgaybatdau) + 1
    End If
    End Function
  • RE: Xác định số ngày từ 2 ngày nhập vào

    Noname > 15-08-11, 09:38 PM

    Hình như Access đã hỗ trợ cho ta hàm này rồi:
    http://thuthuataccess.com/forum/thread-56.html
  • RE: Xác định số ngày từ 2 ngày nhập vào

    haocaocu > 16-08-11, 09:59 AM

    Hàm datediff mình cũng đã sử dụng để tính số tháng ở trên, nhưng sử dụng nó để tính ngày thì không phù hợp với yêu cầu của mình.Như mình nói ở trên có các trường hợp đặc biệt như sau :
    1. Nếu ngày trước là ngày cuối tháng thì tới cuối tháng kế tiếp tính 30 ngày :
    VD: Ngày trước 28/02/2011, Ngày sau : 30/06/2011 thì cách tính như sau :
    28/02->31/03=30 ngày
    31/03->30/04=30 ngày
    30/04->31/05=30 ngày
    31/05->30/06=30 ngày
    để tính đến hết ngày 30/06 ta phải cộng thêm 1 ngày
    Như vậy tổng cộng số ngày ở trên là : 121 ngày (nếu tính bằng hàm datediff cho là : 122 ngày)
    2. Nếu ngày trước là ngày bình thường trong tháng thì cách tính như sau :
    vd: Ngày trước : 13/04/2011, Ngày sau : 30/06/2011 (ngày sau là ngày cuối của mỗi tháng trong năm)
    13/04->13/05=30 ngày
    13/05->13/06=30 ngày
    từ 13/06->30/06=7 ngày (30-13)
    để tính đến hết ngày 30/06 ta phải cộng thêm 1 ngày
    Như vậy số ngày ở trên là : 68 ngày (nếu tính bằng hàm datediff cho là : 78 ngày)
    Nhờ noname xem giúp mình cái. Mình làm nhưng có vài trường hợp nó không đúng ngày.
    Thanks

    Nhầm.Ngày bình thường nó tính 78 ngày là đúng.Sory
  • RE: Xác định số ngày từ 2 ngày nhập vào

    haocaocu > 17-08-11, 03:36 PM

    Mình đã làm được rồi. Đơn giản như thế này :
    Trích dẫn:Public Function Ngay360(ByVal Ngaybatdau As Date, ByVal Ngayketthuc As Date, Optional Phuongthuc As Boolean) As Long
    Dim lSothang, lNgaybatdau, lNgayketthuc As Long
    lNgaybatdau = Day(Ngaybatdau)
    lNgayketthuc = Day(Ngayketthuc)
    lSothang = DateDiff("M", Ngaybatdau, Ngayketthuc)
    If Ngaycuoicuathang(Ngaybatdau) = True Then
    Ngay360 = (lSothang * 30) + 1
    Else
    Ngay360 = (lSothang * 30) + (lNgayketthuc - lNgaybatdau) + 1
    End If
    End Function
    --------------------------------------------
    Public Function Ngaycuoicuathang(dt As Date) As Boolean
    If Month(dt) <> Month(DateAdd("d", 1, dt)) Then
    Ngaycuoicuathang = True
    Else
    Ngaycuoicuathang = False
    End If
    End Function