Di MySQL, Jika saya memiliki daftar rentang tanggal (range-start dan range-end). misalnya
10/06/1983 to 14/06/1983
15/07/1983 to 16/07/1983
18/07/1983 to 18/07/1983
Dan saya ingin memeriksa apakah rentang tanggal lain berisi SALAH SATU rentang yang sudah ada dalam daftar, bagaimana cara melakukannya?
misalnya
06/06/1983 to 18/06/1983 = IN LIST
10/06/1983 to 11/06/1983 = IN LIST
14/07/1983 to 14/07/1983 = NOT IN LIST
Jawaban:
Ini adalah masalah klasik, dan sebenarnya lebih mudah jika Anda membalik logika.
Izinkan saya memberi Anda sebuah contoh.
Saya akan memposting satu periode waktu di sini, dan semua variasi berbeda dari periode lain yang tumpang tindih dalam beberapa cara.
di sisi lain, izinkan saya memposting semua yang tidak tumpang tindih:
Jadi, jika Anda sederhana, kurangi perbandingannya menjadi:
lalu Anda akan menemukan semua yang tidak tumpang tindih, lalu Anda akan menemukan semua periode yang tidak cocok.
Untuk contoh NOT IN LIST terakhir Anda, Anda dapat melihat bahwa itu cocok dengan dua aturan tersebut.
Anda harus memutuskan apakah periode-periode berikut ini DI DALAM atau DI LUAR rentang Anda:
Jika tabel Anda memiliki kolom yang disebut range_end dan range_start, berikut ini beberapa SQL sederhana untuk mengambil semua baris yang cocok:
Perhatikan TIDAK di sana. Karena dua aturan sederhana menemukan semua baris yang tidak cocok , NOT sederhana akan membalikkannya untuk mengatakan: jika bukan salah satu baris yang tidak cocok, itu harus salah satu baris yang cocok .
Menerapkan logika pembalikan sederhana di sini untuk menghilangkan NOT dan Anda akan berakhir dengan:
sumber
Mengambil contoh rentang Anda dari 06/06/1983 hingga 18/06/1983 dan mengasumsikan Anda memiliki kolom yang disebut awal dan akhir untuk rentang Anda, Anda dapat menggunakan klausa seperti ini
yaitu, periksa awal rentang pengujian Anda sebelum akhir rentang database, dan bahwa akhir rentang pengujian Anda adalah setelah atau di awal rentang database.
sumber
Jika RDBMS Anda mendukung fungsi OVERLAP () maka ini menjadi sepele - tidak perlu solusi buatan sendiri. (Di Oracle tampaknya berfungsi tetapi tidak terdokumentasi).
sumber
Dalam hasil yang Anda harapkan, Anda katakan
06/06/1983 sampai 18/06/1983 = DI DAFTAR
Namun, periode ini tidak mengandung atau terkandung oleh salah satu periode di tabel Anda (bukan daftar!) Dari periode. Namun demikian, periode tersebut tumpang tindih antara periode 10/06/1983 hingga 14/06/1983.
Anda mungkin menemukan buku Snodgrass ( http://www.cs.arizona.edu/people/rts/tdbbook.pdf ) berguna: buku ini mendahului mysql tetapi konsep waktu tidak berubah ;-)
sumber
Saya membuat fungsi untuk mengatasi masalah ini di MySQL. Cukup ubah tanggal menjadi detik sebelum digunakan.
sumber
Perhatikan contoh berikut. Ini akan membantu Anda.
sumber
Coba Ini di MS SQL
sumber
sumber
Metode lain dengan menggunakan pernyataan ANTARA sql
Periode termasuk:
Periode dikecualikan:
sumber
sumber