Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Buat daftar semua bulan dari kolom tanggal di ORACLE SQL

Anda salah ketik dan menulis date bukannya dates tetapi Anda juga perlu membuat perubahan kedua dan menggunakan ADD_MONTHS dalam WHERE query kueri rekursif klausa atau Anda akan menghasilkan satu baris terlalu banyak.

WITH t1(test)  AS (
  SELECT MIN(alldates)
  FROM dates 
UNION ALL 
  SELECT ADD_MONTHS(test,1)
  FROM t1 
  WHERE ADD_MONTHS(test,1) <= (SELECT MAX(alldates) FROM dates)
)
SELECT * FROM t1

Keluaran mana:

Namun, kueri yang lebih efisien adalah mendapatkan nilai minimum dan maksimum dalam kueri yang sama dan kemudian beralih menggunakan batas yang telah ditemukan sebelumnya:

WITH t1(min_date, max_date)  AS (
  SELECT MIN(alldates),
         MAX(alldates)  
  FROM   dates 
UNION ALL 
  SELECT ADD_MONTHS(min_date,1),
         max_date
  FROM   t1 
  WHERE  ADD_MONTHS(min_date,1) <= max_date
)
SELECT min_date AS month
FROM   t1

db<>fiddle di sini

Perbarui

Oracle 11gR2 memiliki bug yang menangani kueri tanggal rekursif; ini diperbaiki di versi Oracle yang lebih baru tetapi jika Anda ingin menggunakan SQL Fiddle dan Oracle 11gR2 maka Anda perlu mengulangi nilai numerik dan bukan tanggal. Sesuatu seperti ini:

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

CREATE TABLE dates(
alldates date);

INSERT INTO dates  (alldates) VALUES ('1-May-2017');
INSERT INTO dates  (alldates) VALUES ('1-Mar-2018');

Kueri 1 :

WITH t1(min_date, month, total_months)  AS (
  SELECT MIN(alldates),
         0,
         MONTHS_BETWEEN(MAX(alldates),MIN(alldates))
  FROM   dates 
UNION ALL 
  SELECT min_date,
         month+1,
         total_months
  FROM   t1 
  WHERE  month+1<=total_months
)
SELECT ADD_MONTHS(min_date,month) AS month
FROM   t1

Hasil :

|                MONTH |
|----------------------|
| 2017-05-01T00:00:00Z |
| 2017-06-01T00:00:00Z |
| 2017-07-01T00:00:00Z |
| 2017-08-01T00:00:00Z |
| 2017-09-01T00:00:00Z |
| 2017-10-01T00:00:00Z |
| 2017-11-01T00:00:00Z |
| 2017-12-01T00:00:00Z |
| 2018-01-01T00:00:00Z |
| 2018-02-01T00:00:00Z |
| 2018-03-01T00:00:00Z |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Membuat Prosedur Di Dalam Paket di Oracle

  2. Jumlah Catatan dalam Pernyataan Sisipkan (Oracle)

  3. ExecuteNonQuery selalu mengembalikan nol. Bisakah saya menggunakan nilai 0 ini ke dalam kode saya untuk validasi?

  4. Bisakah operasi penyisipan membuat operasi DDL lain menunggu?

  5. SQL SELECT untuk menemukan referensi siklik di pohon yang diatur ID-ayah?