Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memeriksa tumpang tindih rentang waktu, masalah penjaga [SQL]

Berikut adalah cara untuk meratakan rentang tanggal seperti ini

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

Anda harus membandingkan sebelumnya dan berikutnya tanggal di setiap baris dan lihat apakah

  • Mulai baris saat ini tanggal jatuh di antara rentang tanggal baris sebelumnya.
  • Akhir baris saat ini tanggal jatuh di antara rentang tanggal baris berikutnya.

Menggunakan kode di atas, mengimplementasikan UDF semudah mengikuti.

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. Apa perbedaan antara tabel temp dan variabel tabel di SQL Server?

  2. Cascade menyalin baris dengan semua baris anak dan baris anak mereka, dll

  3. SQL Server:buat cadangan semua database

  4. memecahkan masalah dengan kursor

  5. Dapatkan Semua pukulan masuk dan keluar untuk setiap karyawan?