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

Kiểm tra chồng chéo phạm vi thời gian, sự cố người canh gác [SQL]

Đây là một cách để làm phẳng phạm vi ngày như thế này

Start          | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00

Bạn phải so sánh trước đó tiếp theo ngày trong mỗi hàng và xem liệu

  • Bắt đầu của hàng hiện tại ngày nằm giữa phạm vi ngày của hàng trước.
  • Kết thúc của hàng hiện tại ngày nằm giữa phạm vi ngày của hàng tiếp theo.

Sử dụng mã trên, việc triển khai UDF đơn giản như sau.

create function fnThereIsWatchmenBetween(@from datetime, @to datetime)
returns bit
as
begin
    declare @_Result bit

    declare @FlattenedDateRange table (
        Start   datetime,
        [End]   datetime
    )

    insert  @FlattenedDateRange(Start, [End])
    select  distinct 
            Start = 
                case 
                    when Pv.Start is null then Curr.Start 
                    when Curr.Start between Pv.Start and Pv.[End] then Pv.Start
                    else Curr.Start 
                end,
            [End] = 
                case 
                    when Curr.[End] between Nx.Start and Nx.[End] then Nx.[End] 
                    else Curr.[End] 
                end
    from    shift Curr
            left join shift Pv on Pv.ID = Curr.ID - 1 --; prev
            left join shift Nx on Nx.ID = Curr.ID + 1 --; next

    if exists(  select  1
                from    FlattenedDateRange R
                where   @from between R.Start and R.[End]
                        and @to between R.Start and R.[End]) begin
        set @_Result = 1    --; There is/are watchman/men during specified date range
    end
    else begin
        set @_Result = 0    --; There is NO watchman
    end

    return @_Result
end


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Danh sách chuỗi trong SqlCommand thông qua các tham số trong C #

  2. Bản cập nhật có kích hoạt sự kiện CHÈN vì tất cả các bản cập nhật đều XÓA + (lại) CHÈN trong SQL Server không

  3. Cách tốt nhất để sao chép cơ sở dữ liệu (SQL Server 2008)

  4. Cách kích hoạt ràng buộc khóa ngoại trong SQL Server (Ví dụ T-SQL)

  5. Làm thế nào để tạo tên bảng theo ngày giờ?