Rumah > pangkalan data > tutorial mysql > Bagaimana Mengesan dan Mengekstrak Julat Tarikh Berturut-turut dengan Cekap dalam SQL?

Bagaimana Mengesan dan Mengekstrak Julat Tarikh Berturut-turut dengan Cekap dalam SQL?

Barbara Streisand
Lepaskan: 2025-01-05 01:58:41
asal
940 orang telah melayarinya

How to Efficiently Detect and Extract Consecutive Date Ranges in SQL?

Mengesan Julat Tarikh Berturut-turut dalam SQL

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
)
Salin selepas log masuk

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)
Salin selepas log masuk

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 |
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan