Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tính toán phạm vi ngày bị thiếu và phạm vi ngày trùng lặp giữa hai ngày

Đây là một biến thể nhỏ của hàm để san bằng các khoảng thời gian giao nhau trong SQL Server :

Đây là một trong những trường hợp hiếm khi tiếp cận dựa trên con trỏ trong SQL Server nhanh hơn so với dựa trên bộ:

CREATE FUNCTION mytable(@p_from DATETIME, @p_till DATETIME)
RETURNS @t TABLE
        (
        q_type VARCHAR(20) NOT NULL,
        q_start DATETIME NOT NULL,
        q_end DATETIME NOT NULL
        )
AS
BEGIN
        DECLARE @qs DATETIME
        DECLARE @qe DATETIME
        DECLARE @ms DATETIME
        DECLARE @me DATETIME
        DECLARE cr_span CURSOR FAST_FORWARD
        FOR
        SELECT  startDate, endDate
        FROM    mytable
        WHERE   startDate BETWEEN @p_from AND @p_till
        ORDER BY
                startDate 
        OPEN    cr_span
        FETCH   NEXT
        FROM    cr_span
        INTO    @qs, @qe
        SET @ms = @qs
        SET @me = @qe
        WHILE @@FETCH_STATUS = 0
        BEGIN
                FETCH   NEXT
                FROM    cr_span
                INTO    @qs, @qe
                IF @qs > @me
                BEGIN
                        INSERT
                        INTO    @t
                        VALUES ('overlap', @ms, @me)
                        INSERT
                        INTO    @t
                        VALUES ('gap', @me, @qs)
                        SET @ms = @qs
                END
                SET @me = CASE WHEN @qe > @me THEN @qe ELSE @me END
        END
        IF @ms IS NOT NULL
        BEGIN
                INSERT
                INTO    @t
                VALUES  (@ms, @me)
        END
        CLOSE   cr_span
        RETURN
END
GO

Hàm này nén từng tập hợp các phạm vi giao nhau liền kề thành một phạm vi và trả về cả phạm vi và khoảng cách sau.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 cách tạo cơ sở dữ liệu trên máy chủ được liên kết bằng T-SQL

  2. UNION so với DISTINCT về hiệu suất

  3. Tại sao truyền từ float sang varchar được làm tròn trong SQL Server?

  4. Làm thế nào để tìm tổng của nhiều cột trong một bảng trong SQL Server 2005?

  5. lấy một chuỗi được phân tách bằng dấu phẩy từ các hàng