Pengenalan
Dalam pelbagai aplikasi, kami sering menghadapi keperluan untuk mengumpulkan dan mengekstrak julat tarikh berturut-turut daripada input yang diberikan. Tugas ini timbul dalam situasi seperti populasi kalendar atau analisis data. Dengan memanfaatkan keupayaan berkuasa SQL, kami boleh menyelesaikan masalah dengan cekap tanpa memerlukan gabungan kompleks atau CTE rekursif.
Definisi Masalah
Pertimbangkan lajur bernama 'InfoDate' yang mengandungi urutan tarikh, seperti yang digambarkan di bawah:
InfoDate |
---|
2013-12-04 |
2013-12-05 |
2013-12-06 |
2013-12-09 |
2013-12-10 |
2014-01-01 |
2014-01-02 |
2014-01-03 |
2014-01-06 |
2014-01-07 |
2014-01-29 |
2014-01-30 |
2014-01-31 |
2014-02-03 |
2014-02-04 |
Objektifnya adalah untuk mengenal pasti setiap julat tarikh berturut-turut dan mengekstrak tarikh mula dan tamat untuk setiap selang. Seperti yang digambarkan dalam contoh di bawah, tarikh berturut-turut harus dikumpulkan bersama untuk membentuk julat:
StartDate | EndDate |
---|---|
2013-12-04 | 2013-12-06 |
2013-12-09 | 2013-12-10 |
2014-01-01 | 2014-01-03 |
2014-01-06 | 2014-01-07 |
2014-01-29 | 2014-01-31 |
2014-02-03 | 2014-02-04 |
SQL Solution
Untuk mencapai hasil ini menggunakan SQL, kami menggunakan teknik yang menggunakan gabungan penomboran baris dan pembezaan tarikh. Dengan menggunakan fungsi ROW_NUMBER(), kami menetapkan nombor jujukan ('i') pada setiap baris lajur 'InfoDate' dan mencipta lajur bernama 'd'. Lajur ini mewakili perbezaan antara setiap tarikh dan nombor barisnya yang sepadan.
WITH t AS ( SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i FROM @d GROUP BY InfoDate )
Langkah berikut melibatkan pengumpulan baris mengikut perbezaan antara lajur 'i' dan 'd' (DATEDIFF(hari,i, d)). Pengumpulan ini membolehkan kami mengenal pasti tarikh berturut-turut kerana ia akan berkongsi nilai perbezaan yang sama.
SELECT MIN(d),MAX(d) FROM t GROUP BY DATEDIFF(day,i,d)
Dengan menggunakan fungsi MIN() dan MAX() dalam setiap kumpulan, kita boleh menentukan tarikh mula dan tamat setiap julat berturut-turut.
| StartDate | EndDate | |---|---| | 2013-12-04 | 2013-12-06 | | 2013-12-09 | 2013-12-10 | | 2014-01-01 | 2014-01-03 | | 2014-01-06 | 2014-01-07 | | 2014-01-29 | 2014-01-31 | | 2014-02-03 | 2014-02-04 |
Dengan cara ini, kami telah mengekstrak julat tarikh berturut-turut dengan cekap menggunakan berasaskan SQL semata-mata pendekatan.
Atas ialah kandungan terperinci Bagaimana Mengesan dan Mengekstrak Julat Tarikh Berturut-turut dengan Cekap dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!