Home > SQL > Hàm đếm số ngày thứ trong 1 khoảng thời gian

Hàm đếm số ngày thứ trong 1 khoảng thời gian

Đôi khi mình cần phải đếm số thứ trong một khoảng thời gian nào đó. Ví dụ: Cần đếm xem trong tháng 11 có bao nhiêu ngày thứ 2, hay bao nhiêu ngày thứ 3.

Áp dụng thực tế: Cần tính dự kiến thu tiền trong tháng cho 1 hợp đồng mua bán trả góp với hình thức góp theo tuần.

User Defined Function sau đây cung nhận vào 3 tham số ngày bắt đầu, ngày kết thúc và ngày thứ cần đếm. Trả về số ngày thứ trong khoảng thời gian truyền vào (từ ngày bắt đầu đến ngày kết thúc)

-- =============================================
-- Author:        Chungtv
-- Create date: 11/11/2010
-- Description:    Dem so ngay thu trong mot khoang thoi gian bat ky
-- @pBeginDate: Ngay bat dau khoang thoi gian can dem
-- @pEndDate: Ngay ket thuc khoang thoi gian can dem
-- @pWeekday: Ngay thu can dem (CN~1; Thu2~2, Thu3~3 ...)
-- Example:
--        SET DATEFORMAT DMY
--        SET DATEFIRST 1
--        PRINT [dbo].[afCountOfWeekday]('01/11/2010','30/11/2010',2)
-- =============================================
CREATE FUNCTION [dbo].[afCountOfWeekday]
(
    @pBeginDate smalldatetime,
    @pEndDate smalldatetime,
    @pWeekday int
)
RETURNS int
AS
BEGIN
    declare @iBeginWd int, @d1 int, @d2 int
    set @iBeginWd = datepart(dw,@pBeginDate)
    set @d1 = datediff(day,@pBeginDate,@pEndDate) 
    if @pWeekday >= @iBeginWd
        set @d2 = @pWeekday - @iBeginWd
    else
        set @d2 = @pWeekday + 7 - @iBeginWd
    return (@d1 - @d2) / 7 + 1
END

Advertisements
Categories: SQL Tags:
  1. HuyTD
    21/07/2016 at 10:28

    Sửa lại func của ChungTV như sau :

    declare @iBeginWd int, @d1 int, @d2 int, @Weekday int
    set @iBeginWd = datepart(dw,@pBeginDate)
    set @d1 = datediff(day,@pBeginDate,@pEndDate)
    if @pWeekday >= @iBeginWd
    set @d2 = @pWeekday – @iBeginWd
    else
    set @d2 = @pWeekday + 7 – @iBeginWd
    if (@d1 – @d2) < 0
    set @Weekday = 0
    else
    set @Weekday = (@d1 – @d2) / 7 + 1
    return @Weekday

    Bạn nguyetquang hoàn toàn đúng, nhưng chạy while thì không ổn nếu dữ liệu lớn.

  2. nguyetquangxa
    10/01/2012 at 17:24

    mình viết hàm đếm số ngày thứ trong 1 khoảng thời gian theo cách khác :

    create FUNCTION [dbo].[fuCountOfWeekday_test]
    (
    @BeginDate smalldatetime, –ngày bắt đầu
    @EndDate smalldatetime, –ngày kết thúc
    @Weekday int — số ngày cần đếm,Chủ Nhật = 1; Thứ 2=2, Thứ 3 = 3,…
    )
    RETURNS int
    AS
    BEGIN
    declare @count int = 0
    — datepart(dw,@BeginDate) : trả về số đại điện cho ngày bắt đầu
    while (@BeginDate <= @EndDate)
    begin
    if datepart(dw,@BeginDate) = @Weekday set @count = @count + 1
    set @BeginDate= @BeginDate+1
    end
    return @count
    END

  3. nguyetquangxa
    10/01/2012 at 15:34

    Từ ngày mùng 2 tháng 12 đến ngày mùng 5 tháng 12 đâu có ngày chủ nhật nào mà hàm của bạn vẫn trả kết quả về 1

    select dbo.afCountOfWeekday(’12/2/2011′,’12/5/2011′,1) = 1

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: