مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۲ دقیقه·۱ سال پیش

بررسی امکان استفاده از توابع جمع و میانگین (توابع تجمیعی) بر نوع داده ای مدت زمان در پایگاه داده اوراکل ۲۳C


در پایگاه داده اوراکل ۲۳c امکان جدیدی معرفی شده که شما می توانید از توابع جمع (SUM )  و میانگین (AVG ) (توابع تجمیع کننده (  بر روی داده های از نوع مدت زمان (INTERVAL ) استفاده کنید. باید اشاره کرد این امکان در توابع MAX وMIN و توابع تحلیلی در نگارش های گذشته وجود داشت.

مستند و فیلم نصب راه اندازه پایگاه داده Oracle 23c در محیط لینوکس

ایجاد محیط آزمایش :

drop table if exists t1 purge;

create table t1 (

id          number,

start_time  timestamp,

end_time    timestamp,

duration    interval day to second generated always as (end_time – start_time) virtual

);

insert into t1 (id, start_time, end_time) values (1, timestamp ‘2023-04-10 08:45:00.0’, timestamp ‘2023-04-10 18:01:00.0’);

insert into t1 (id, start_time, end_time) values (2, timestamp ‘2023-04-11 09:00:00.0’, timestamp ‘2023-04-11 17:00:00.0’);

insert into t1 (id, start_time, end_time) values (3, timestamp ‘2023-04-12 08:00:00.0’, timestamp ‘2023-04-12 17:45:00.0’);

insert into t1 (id, start_time, end_time) values (4, timestamp ‘2023-04-13 07:00:00.0’, timestamp ‘2023-04-13 16:00:00.0’);

commit;

فرمت نمایش زمان و تاریخ را برای خوانایی بهتردر session جاری تغییر می دهیم

alter session set nls_timestamp_format=’yyyy-mm-dd hh24:mi:ss’;

select * from t1;

ID START_TIME           END_TIME             DURATION

———- ——————– ——————– ——————–

۱ ۲۰۲۳-۰۴-۱۰ ۰۸:۴۵:۰۰  ۲۰۲۳-۰۴-۱۰ ۱۸:۰۱:۰۰  +۰۰ ۰۹:۱۶:۰۰٫۰۰۰۰۰۰

۲ ۲۰۲۳-۰۴-۱۱ ۰۹:۰۰:۰۰  ۲۰۲۳-۰۴-۱۱ ۱۷:۰۰:۰۰  +۰۰ ۰۸:۰۰:۰۰٫۰۰۰۰۰۰

۳ ۲۰۲۳-۰۴-۱۲ ۰۸:۰۰:۰۰  ۲۰۲۳-۰۴-۱۲ ۱۷:۴۵:۰۰  +۰۰ ۰۹:۴۵:۰۰٫۰۰۰۰۰۰

۴ ۲۰۲۳-۰۴-۱۳ ۰۷:۰۰:۰۰  ۲۰۲۳-۰۴-۱۳ ۱۶:۰۰:۰۰  +۰۰ ۰۹:۰۰:۰۰٫۰۰۰۰۰۰

انجام آزمایش:

در نگارش های گذشته با خطا مواجه می شویم.

select sum(duration) from t1;

*

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND

SQL>

select avg(duration) from t1

*

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND

SQL>

در نگارش ۲۳c همانطور که مشاهده می کنید این عملیات بدون خطا اجرا می شود.

select sum(duration) from t1;

SUM(DURATION)

—————————————————————————

+۰۰۰۰۰۰۰۰۱ ۱۲:۰۱:۰۰٫۰۰۰۰۰۰۰۰۰

SQL>

select avg(duration) from t1;

AVG(DURATION)

—————————————————————————

+۰۰۰۰۰۰۰۰۰ ۰۹:۰۰:۱۵٫۰۰۰۰۰۰۰۰۰

SQL>

می توان این توابع را به صورت تحلیلی نیز استفاده کرد:

set linesize 120

column sum_duration format a30

select id,

start_time,

end_time,

duration,

sum(duration) over () as sum_duration

from t1;

ID START_TIME           END_TIME             DURATION             SUM_DURATION

———- ——————– ——————– ——————– ——————————

۱ ۲۰۲۳-۰۴-۱۰ ۰۸:۴۵:۰۰  ۲۰۲۳-۰۴-۱۰ ۱۸:۰۱:۰۰  +۰۰ ۰۹:۱۶:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۱ ۱۲:۰۱:۰۰٫۰۰۰۰۰۰۰۰۰

۲ ۲۰۲۳-۰۴-۱۱ ۰۹:۰۰:۰۰  ۲۰۲۳-۰۴-۱۱ ۱۷:۰۰:۰۰  +۰۰ ۰۸:۰۰:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۱ ۱۲:۰۱:۰۰٫۰۰۰۰۰۰۰۰۰

۳ ۲۰۲۳-۰۴-۱۲ ۰۸:۰۰:۰۰  ۲۰۲۳-۰۴-۱۲ ۱۷:۴۵:۰۰  +۰۰ ۰۹:۴۵:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۱ ۱۲:۰۱:۰۰٫۰۰۰۰۰۰۰۰۰

۴ ۲۰۲۳-۰۴-۱۳ ۰۷:۰۰:۰۰  ۲۰۲۳-۰۴-۱۳ ۱۶:۰۰:۰۰  +۰۰ ۰۹:۰۰:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۱ ۱۲:۰۱:۰۰٫۰۰۰۰۰۰۰۰۰

SQL>

column avg_duration format a30

select id,

start_time,

end_time,

duration,

avg(duration) over () as avg_duration

from t1;

ID START_TIME           END_TIME             DURATION             AVG_DURATION

———- ——————– ——————– ——————– ——————————

۱ ۲۰۲۳-۰۴-۱۰ ۰۸:۴۵:۰۰  ۲۰۲۳-۰۴-۱۰ ۱۸:۰۱:۰۰  +۰۰ ۰۹:۱۶:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۰ ۰۹:۰۰:۱۵٫۰۰۰۰۰۰۰۰۰

۲ ۲۰۲۳-۰۴-۱۱ ۰۹:۰۰:۰۰  ۲۰۲۳-۰۴-۱۱ ۱۷:۰۰:۰۰  +۰۰ ۰۸:۰۰:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۰ ۰۹:۰۰:۱۵٫۰۰۰۰۰۰۰۰۰

۳ ۲۰۲۳-۰۴-۱۲ ۰۸:۰۰:۰۰  ۲۰۲۳-۰۴-۱۲ ۱۷:۴۵:۰۰  +۰۰ ۰۹:۴۵:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۰ ۰۹:۰۰:۱۵٫۰۰۰۰۰۰۰۰۰

۴ ۲۰۲۳-۰۴-۱۳ ۰۷:۰۰:۰۰  ۲۰۲۳-۰۴-۱۳ ۱۶:۰۰:۰۰  +۰۰ ۰۹:۰۰:۰۰٫۰۰۰۰۰۰  +۰۰۰۰۰۰۰۰۰ ۰۹:۰۰:۱۵٫۰۰۰۰۰۰۰۰۰

SQL>

منبع مستند

جهت مشاوره، آموزش خدمات نگهداری و پشتیبانی پایگاه داده اوراکل با ما در ارتباط باشید

مشاوره اوراکلخدمات نگهداری اوراکلآموزش اوراکلoracle 23cمسعود سلطانی راد
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید