عملگر ها و توابع بازیابی تاریخ و زمان
جهت بازیابی و مشاهده ی تاریخ و زمان سیستم مورد نظر از توابع زیر استفاده کنید.
- CURRENT_DATE : تاریخ جاری را بر اساس time وابسته به موقعیت جغرافیایی و بر اساس جنس تاریخ میلادی برمی گرداند.
- SYSDATE : تاریخ و زمان جاری را بازگردانی می نماید.
- SYSTIMESTAMP : این تابع تاریخ سیستم و نیز کسر ثانیه ها و منطقه ی زمانی پایگاه داده ی مربوطه را بازایابی می کند. نوع بازگشتی (return type)، TIMESTAMP WITH TIME ZONE خواهد بود.
مثالی از کاربرد تابع SYSDATE
به منظور بازیابی و مشاهده ی تاریخ و زمان جاری سیستم، کافی است یک query مانند مثال زیر بنویسید.
1 2 3 4 5 6 7 8 9 | select sysdate from dual; SYSDATE ------- 8-AUG-03<button></button> |
فرمت یا قالب نمایش تاریخ و زمان جاری سیستم به پارامتر NLS_DATE_FORMAT بستگی دارد.
به عنوان مثال، می توان قالب نمایش تاریخ و زمان را بدین ترتیب تنظیم کرد.
1 | Alter session set NLS_DATE_FORMAT=’DD-MON-YYYY HH:MIpm’;<button></button> |
سپس دستور زیر را اجرا کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | select sysdate from dual; SYSDATE ------------------ 8-AUG-2003 03:05pm<button></button> |
تنظیم پیش فرض پارامتر NLS_DATE_FORMAT، فرمت DD-MON-YY می باشد.
مثالی از کاربرد تابع CURRENT_DATE
جهت مشاهده ی تاریخ و زمان جاری سیستم بر اساس موقعیت جغرافیایی آن، کافی است از تابع CURRENT_DATE استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | ALTER SESSION SET TIME_ZONE = '-4:0' ; ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS' ; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE --------------- -------------------- -04:00 22-APR-2003 14:15:03 ALTER SESSION SET TIME_ZONE = '-7:0' ; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE --------------- -------------------- -07:00 22-APR-2003 09:15:33<button></button> |
مثالی از کاربرد تابع SYSTIMESTAMP
به منظور مشاهده ی تاریخ و زمان جاری سیستم بر اساس موقعیت جغرافیایی که تا کسر ثانیه دقیق می باشد (تمام ثانیه های کسری را نیز نمایش می دهد)، از دستور زیر استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Select systimestamp from dual; SYSTIMESTAMP ------------------------------- 22-APR-03 08.38.55.538741 AM -07:00<button></button> |
DATE FORMAT MODEL (مدل فرمت دهی به تاریخ)
تابع to_char به شما این امکان را می دهد که یک نوع داده ی NUMBER یا DATE را به یک رشته ی متنی تبدیل کنید.
برای تبدیل یک مقدار کاراکتری (که ممکن است format آن هر فرمتی به جز فرمت پیش فرض نمایش تاریخ باشد) به یک مقدار تاریخی از تابع to-date بهره می گیریم. این تابع یک مقدار تاریخی که به صورت رشته نمایش داده شده را به فرمت نمایش تاریخ در oracle تبدیل می کند.
به عنوان مثال، برای مشاهده ی تاریخ جاری می توان query زیر را نوشت.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Select to_char(sysdate,’ DAY ’)”Today” FROM DUAL; TODAY ------- THURSDAY<button></button> |
در oracle، date format model های فراوانی وجود دارد که به ترتیب زیر می باشد.
به عنوان مثال، برای مشاهده ی تاریخ امروز با فرمت بکار رفته در نمونه ی زیر
1 | Friday, 7th March, 2014 <button></button> |
دستور زیر را بنویسید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | select to_char(sysdate,’ Day , ddth Month , yyyy’)”Today” from dual; TODAY ------------------------ Friday, 7th March, 2014<button></button> |
برای مشاهده ی تاریخ استخدام تمامی کارکنان شرکت، با فرمت زیر
1 | Friday, 8th August, 2003 <button></button> |
از این دستور استفاده می کنیم.
1 | select to_char(hire_date,’ Day , ddth Month , yyyy’) from emp;<button></button> |
مثال هایی از کاربرد تابع TO_DATE
همان طور که پیش تر ذکر شد، این تابع برای تبدیل مقدار رشته ای به مقادیر تاریخی بکار می رود. برای مثال می خواهیم روز یک تاریخ مشخص مثل 15-aug-1947 را بدست بیاوریم. برای این منظور ابتدا تابع to-date را برای تبدیل مقدار رشته ای به مقدار تاریخی مورد استفاده قرار می دهیم، سپس مقدار حاصل را به تابع to-char پاس می دهیم (ارسال می کنیم) تا روز مورد نظر بدست آید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | select to_char(to_date(’15-aug-1947’,’dd-mon-yyyy’),’ Day ’) from dual; TO_CHAR( -------- Friday<button></button> |
برای بدست آوردن تعداد روزهایی که از تاریخ 15-aug-1947 تاکنون سپری شده، می توان query زیر را بکار برد.
1 2 3 4 5 | Select sysdate-to_date(’15-aug-1947’,’dd-mon-yyyy’) from dual;<button></button> |
حال می خواهیم اسم روز هفته که پس از گذشت 45 روز از تاریخ امروز رخ می دهد را بدست آوریم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Select sysdate+45 from dual; SYSDATE ------- 06-JUN-2003<button></button> |
تابع ADD_MONTHS
برای بدست آوردن اسم روزی که پس از گذشت 6 ماه از تاریخ امروز، رخ می دهد، تابع زیر را بکار می بریم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Select ADD_MONTHS(SYSDATE,6) from dual; ADD_MONTHS ---------- 22-OCT-2003<button></button> |
تابع MONTHS_BETWEEN
برای بدست آوردن مقدار تعداد ماه هایی که از تاریخ 15-aug-1947 تاکنون سپری شده، تابع MONTHS_BETWEEN را مورد بهره وری قرار می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Select months_between(sysdate,to_date(’15-aug-1947’)) from dual; Months ------ 616.553<button></button> |
درصورت تمایل می توانید ارقام پس از ممیز را با استفاده از تابع truncate حذف کنید.
تابع LAST_DAY
به منظور مشاهده ی آخرین روز یک ماه از تاریخ معین، تابع LAST_DAY را بکار می بریم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | select LAST_DAY(sysdate) from dual; LAST_DAY -------- 31-AUG-2003<button></button> |
تابع NEXT_DAY
برای مثال، می خواهیم تاریخ شنبه ی بعدی را بدست بیاوریم. برای این منظور تابع NEXT_DAY را مورد استفاده قرار می دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | select next_day(sysdate) from dual; NEXT_DAY ----------- 09-AUG-2003<button></button> |
تابع EXTRACT
این تابع برای بازیابی روز، ماه یا سال از یک تاریخ استفاده می شود (تنها بخشی از یک تاریخ / زمان را بر می گرداند(.
این تابع مقدار فیلد datetime مشخص شده را از عبارت دربردانده ی مقدار interval یا یک datetime، استخراج کرده و برمی گرداند. پس از اینکه TIMEZONE_REGION یا TIMEZONE_ABBR را استخراج می کنید، مقدار بازگشتی یک رشته دربردارنده ی time zone یا مخفف مد نظر خواهد
بود.
ساختار نگارشی تابع EXTRACT بدین ترتیب می باشد.
1 | EXTRACT ( YEAR / MONTH / WEEK / DAY / HOUR / MINUTE / TIMEZONE FROM DATE )<button></button> |
Query زیر با استفاده از تابع EXTRACT، مقدار سال را از عبارت دربردارنده ی تاریخ جاری استخراج کرده و بازیابی می نماید.
1 2 3 4 5 6 7 8 9 | Select extract( year from sysdate) from dual; EXTRACT ------- 2003<button></button> |