Oracle 10g: memilih n tanggal dari ganda dengan format YYYY-MM

Saya mencoba menampilkan 12 bulan dari 5 tahun di bulan Maret. Satu-satunya cara agar saya bisa melakukannya dengan benar adalah dengan:

select to_char(add_months(sysdate, level-51),'YYYY-MM') 
from dual 
connect by level <= 12

Tampilan mana:

2014-03
2014-04
2014-05
...

Bagaimanapun aku butuh kencan.

Tapi coba gunakan:

select to_date(to_char(add_months(sysdate, level-51),'YYYY-MM'),'YYYY-MM') 
from dual 
connect by level <= 12

Berikan bulannya:

2014-03-01
2014-04-01
2014-05-01
...

Pertanyaan Apakah ada yang punya solusi?

Sunting:

Sedang mengerjakan

alter session set nls_date_format='YYYY-MM';

Perbaiki masalahnya tetapi bagaimana cara mengatur format ini dalam prosedur tersimpan?


person Hey StackExchange    schedule 23.05.2018    source sumber
comment
Jadi Anda ingin mendapatkan keluaran tipe tanggal, dan menampilkannya dalam format 'YYYY-MM'? IMO Anda harus melakukan pemformatan itu di lapisan presentasi Anda (front-end, aplikasi), karena format apa pun yang Anda lakukan di database Anda, output yang Anda dapatkan di aplikasi Anda adalah datetime, yang mungkin memiliki format tampilan default berbeda dari database Anda.   -  person Pham X. Bach    schedule 23.05.2018
comment
Ini terkait dengan masalah ini: stackoverflow.com/questions/50476162/ Sekarang saya memiliki solusi untuk masalah ini, tetapi ini hanya akan berfungsi jika saya dapat mengubah YYYY-MM-DD menjadi YYYY-MM.   -  person Hey StackExchange    schedule 23.05.2018
comment
Untuk masalah Anda sebelumnya, Anda harus melakukan CROSS JOIN menggunakan tabel kalender dan EID Anda yang berbeda, bukan perulangan for. Dan mengapa Anda peduli tentang memformat tipe datetime ketika Anda mencoba memasukkan ke tabel? Setelah dimasukkan, itu hanya tipe tanggal-waktu, dan akan memiliki semua bagian: tahun, bulan, hari, jam, menit, detik. Cari dan baca lebih lanjut tentang tipe data Oracle DATE. Jadi Anda hanya perlu SELECT TRUNC(ADD_MONTHS(SYSDATE, LEVEL-51), 'MM') FROM dual CONNECT BY LEVEL <= 12   -  person Pham X. Bach    schedule 23.05.2018
comment
Terima kasih. Memang benar menemukan solusi seputar saran Anda.   -  person Hey StackExchange    schedule 23.05.2018


Jawaban (1)


Anda cukup memotong nilai yang dihasilkan:

select trunc(add_months(sysdate, level-51), 'MM')
from dual
connect by level <= 12
person Gordon Linoff    schedule 23.05.2018
comment
Terima kasih. Bagaimana tampilan perintah ini jika sysdate adalah string? Misalnya. ''2014-05' tidak akan berhasil. Apakah ada cara untuk menghindari keharusan memasukkan string tanggal lengkap (dengan waktu)? - person Hey StackExchange; 23.05.2018
comment
@HeyStackExchange . . . Saya tidak mengerti pertanyaannya. sysdate adalah kencan. Anda harus menggunakan tanggal untuk metode ini. Jika Anda memiliki string, ubahlah menjadi tanggal. - person Gordon Linoff; 23.05.2018