سوال 2️⃣ میخواهیم تابعی بنویسیم که یک رشته ورودی که مشخص کننده یک تاریخ شمسی است را دریافت کرده و آخرین روز تاریخ ورودی را باز گرداند؟

برای پاسخ به این سوال باید دقت داشته باشید که آخرین روز برای ماه های 30 روزه ، 31 روزه و 29 روزه در تقویم شمسی با تقویم میلادی متفاوت است عملکرد تابع فوق باید به نحوی باشد که
اگر 1395/01/15 را به عنوان ورودی دریافت کرد تاریخ 1395/01/31 را بازگرداند
اگر 1395/07/15 را به عنوان ورودی دریافت کرد تاریخ 1395/07/30 را بازگرداند
اگر 1395/12/12 را به عنوان ورودی دریافت کرد تاریخ 1395/12/30 را بازگرداند (سال 95 کبیسه است)

✔️ در اوراکل تابعی با نام last_day وجود دارد که یک تاریخ میلادی را دریافت کرده و آخرین روز تاریخ وارد شده را باز میگرداند (آخرین روز بر مبنای تقویم میلادی محاسبه میشود)
✔️ همانطور که میدانید اوراکل از تقویم شمسی بصورت کامل پشتیبانی میکند ، برای استفاده از این امکان باید مشخص کنیم که مبنای عملکرد تقویم برنامه ما بر اساس تاریخ شمسی باشد
✔️این تکنیک میتواند برای تابع add_months نیز استفاده شود
✔️ برای پاسخ به این سوال به کدهای ذیل دقت نمایید 👇👇👇👇

create or replace function get_per_last_day(p_per_date varchar2)
return varchar2 as
v_res varchar2(10);

begin
/*1*/ execute immediate ‘alter session set nls_calendar=persian’;
/*2*/ v_res := to_char(last_day(to_date(p_per_date,
‘yyyy/mm/dd’,
‘nls_calendar=persian’)),
‘yyyy/mm/dd’,
‘nls_calendar=persian’);

/*3*/ execute immediate ‘alter session set nls_calendar=gregorian’;
/*4*/ return v_res;

end get_per_last_day;

 

👈 در سطر /*1*/ با استفاده از دستور alter session set nls_calendar=persian عملکرد تقویم session جاری را بر اساس تقویم شمسی تغییر داده ایم
👈 در سطر /*2*/ با استفاده از توابع تبدیل نوع ابتدا رشته ورودی را تبدیل به نوع تاریخ کرده و سپس خروجی را وارد تابع last_day کرده و در پایان تاریخ بدست آمده را (آخرین روز کاری) دوباره به رشته شمسی تبدیل میکنیم
👈 در سطر /*3*/ تقویم session جاری را به حالت پیش فرض که تقویم میلادی است باز میگردانیم
👈 در سطر /*4*/ مقدار خروجی را باز میگردانیم

حالتهای مختلف صدا کردن تابع فوق به شکل زیر است 👇👇👇👇


دانلود فایل pdf