Mungkin seseorang dapat membantu saya .. Saya memiliki kursor untuk loop di sini. Saya ingin mencetak nama depan dan usia (dalam desimal, mis. 55,6 tahun). Saya tahu bahwa bagian WHERE dari kode saya tidak benar. Saya mencoba mengambil 6 char (tahun dan bulan) pertama dengan fungsi substr() dari string varchar2(12). Lalu saya ingin mengubahnya menjadi tanggal dan mengurangi dari sysdate. Mungkin aku salah. Merasa bingung :(

CREATE TABLE client(
pers_nr VARCHAR2(12) PRIMARY KEY,
fname VARCHAR2(20);

INSERT INTO client VALUES('19490321-789','Anna');


declare 
cursor c_info_client is select fname, substr(pers_nr, 1, 6)
                        from client
           --wrong!--   where substr(pnr, 1, 6) : = to_date(YYYY-MM) - sysdate;
begin
for rec in c_info_client loop
dbms_output.put_line(initcap(rec.fname) ||', ' || rec.pers_pnr ||' years');
end loop;
end;

Jawabannya akan terlihat seperti (salah satu dari banyak baris):

Anna, 34,7 tahun

0
Baibs 11 Mei 2021, 21:12

1 menjawab

Jawaban Terbaik

Anda tampaknya tidak menginginkan klausa where sama sekali; Anda ingin mengonversi enam karakter pertama pers_nr menjadi tanggal, dan melihat berapa tahun antara tanggal tersebut dan hari ini.

Anda dapat menghitung usia dengan:

trunc(months_between(sysdate, to_date(substr(pers_nr, 1, 6), 'YYYYMM'))/12, 1)
  • substr(pers_nr, 1, 6) memberi Anda enam karakter => 19490321
  • to_date(substr(pers_nr, 1, 6), 'YYYYMM') mengubahnya menjadi tanggal => 1949-03-21
  • months_between(sysdate, ...) memberi Anda jumlah bulan => 839,4
  • months_between(sysdate, ...)/12 memberi Anda jumlah tahun=> 72.196
  • trunc(..., 1) memotongnya menjadi satu tempat desimal => 72.1

Jadi blok PL/SQL Anda adalah:

declare 
  cursor c_info_client is
    select fname,
      trunc(months_between(sysdate, to_date(substr(pers_nr, 1, 6), 'YYYYMM'))/12, 1) as age
    from client;
begin
  for rec in c_info_client loop
    dbms_output.put_line(initcap(rec.fname) ||', ' || rec.age ||' years');
  end loop;
end;
/

Yang memberikan:

Anna, 72.1 years

db<>biola dengan kursor, dan kueri sederhana untuk menunjukkan langkah-langkahnya.

Anda dapat menggunakan trunc(sysdate) untuk mengambil waktu dari tengah malam pagi ini, tetapi tidak akan membuat banyak perbedaan di sini.

Secara default, usia akan ditampilkan dengan pemisah desimal dari setelan NLS_NUMERIC_CHARACTERS sesi Anda. Jika Anda ingin semua pengguna selalu melihat hal yang sama secara terpisah, Anda dapat menggunakan to_char() dengan format mask yang sesuai.

3
Alex Poole 11 Mei 2021, 18:43