چگونه تاریخ برداشت از پایگاه داده فرمت مناسب d.m.y. (روز. ماه. سال) اوراکل. تابع ()to_char به ما کمک خواهد کرد. به لطف آن می توانید زمان را به فرمت مورد نظر تبدیل کنید. به یک مثال نگاه کنید.
SELECT to_char (current_timestamp، "DD.MM.YYYY") به عنوان date_create از DUAL
قالب زمان DD.MM.YYYY (روز، ماه، سال) است. می توانید از هر کاراکتری به عنوان جداکننده استفاده کنید: /، :، -.
برای نمایش زمان فعلی در قالب روز. ماه. سال ساعت: دقیقه: ثانیه، از پارامترهای DD.MM.YYYY HH24:MI:SS استفاده کنید.
SELECT to_char (current_timestamp, "DD.MM.YYYY HH24:MI:SS") به عنوان date_create از DUAL /* خروجی: 10/6/2017 4:50:52 بعد از ظهر */
فرض کنید می خواهید ابتدای سال را نمایش دهید؟ شما به طور خودکار با سال جاری جایگزین خواهید شد. در این مثال، من از الحاق || استفاده کردم. بیشتر اطلاعات دقیقدر صفحه TO_CHAR FUNCTION پیدا خواهید کرد. در آن صفحه است لیست بزرگگزینه هایی برای تبدیل تاریخ به رشته
"01.01" را انتخاب کنید. || to_char (current_timestamp، "YYYY") به عنوان date_create از DUAL
بازدید: 1762، سطح: آسان، امتیاز: 0، تاریخ: 1395/10/26 14:07:32
در این بخش، روی توابع کار با تاریخ/زمان و توابع تبدیل انواع برای تاریخ تمرکز خواهیم کرد. Oracle نوع خاصی از DATE را برای ذخیره تاریخ و زمان ارائه می دهد. از جانب نقطه فیزیکیآن را مشاهده کنید یک عدد کسری, کل بخشکه تعداد روزها از تاریخ پایه را ذخیره می کند و کسری زمان را ذخیره می کند. این به شما این امکان را میدهد که روی تاریخها متعهد شوید عملیات حسابی- جمع و تفریق.
تابع SYSDATE
این یکی از پر استفاده ترین توابع است، تاریخ و زمان فعلی را مطابق با ساعت سرور برمی گرداند. مثال:
SYSDATE را انتخاب کنید
از دوگانه
SYSDATE
26.12.2007
16:24:43
تابع ADD_MONTHS(d، x)
تاریخ به دست آمده با افزودن یک یا چند ماه به تاریخ d را برمی گرداند. تعداد ماه ها با پارامترهای x داده می شود و x می تواند منفی باشد - در این حالت، تعداد ماه های مشخص شده از تاریخ داده شده کم می شود.
SELECT SYSDATE d،
ADD_MONTHS (SYSDATE، 3) d1، ADD_MONTHS (SYSDATE، -3) d2
از دوگانه
26.12.2007 16:24:43 |
26.03.2008 16:24:43 |
26.09.2007 16:24:43 |
تابع LAST_DAY(d).
آخرین روز ماه مشخص شده در تاریخ d را برمی گرداند. مثال:
SELECT SYSDATE d،
LAST_DAY (SYSDATE) d1
از دوگانه
26.12.2007 16:24:43 |
31.12.2008 16:24:43 |
این تابع برای تعیین تعداد روز در یک ماه بسیار مفید است، به عنوان مثال:
SELECT SYSDATE d،
TO_CHAR(LAST_DAY(SYSDATE)، "DD") d1
از دوگانه
26.12.2007 16:24:43 |
تابع MONTHS_BETWEEN(dl, d2)
تابع MONTH_BETWEEN تعداد ماههای بین دو تاریخ dl و d2 را با علامت dl-d2 برمیگرداند، عدد برگردانده شده یک کسری است.
SELECT MONTHS_BETWEEN("2.09.2006", "2.05.2006") d1,
M0NTHS_BETWEEN("09/12/2006"، "05/2/2006") d2،
M0NTHS_BETWEEN("2.05.2006"، "12.09.2006") d3
از دوگانه
4,32258064516129 |
4,32258064516129 |
تابع TRUN C (d[,mask ])
تاریخ مشخص شده را با توجه به ماسک کوتاه می کند. اگر ماسک مشخص نشده باشد، برش تا تاریخ انجام می شود (زمان کنار گذاشته می شود).
SYSDATE را انتخاب کنیدd1،
TRUNC(SYSDATE) d2
از دوگانه
26.09.2006 16:45:26 |
نمونه های معمولی را در نظر بگیرید - کوتاه کردن تاریخ به ساعت، روز، ماه و سال. ماسک فرمت پیش فرض "DD" است
SYSDATE را انتخاب کنیدdl،
TRUNC(SYSDATE، "HH24") d2،
TRUNC(SYSDATE، "DD") d3،
TRUNC(SYSDATE، "MM") d4،
TRUNC(SYSDATE، "YYYY") d5
از دوگانه
26.09.2006 16:49:21 |
26.09.2006 16:00:00 |
26.09.2006 01.09.2006 01.01.2006 |
تابع ROUND(d[,mask]).
تابع ROUND شبیه TRUNC است، اما به جای کوتاه کردن، گرد کردن را انجام می دهد. ماسک فرمت پیش فرض "DD" است. مثال:
انتخاب کنیدSYSDATEد1,
گرد (SYSDATE)d2،
گرد(SYSDATE،"
HH24")
d3،
گرد(SYSDATE, "
DD")
d4,
گرد(SYSDATE،"MM") d5
از دوگانه
26.09.2006 16:50:50 |
27.09.2006 26.09.2006 17:00:00 |
27.09.2006 01.10.2006 |
قالببندی ماسکها برای توابع TRUNC و ROUND معتبر است
بیایید نگاهی دقیق تر به ماسک های قالب و ویژگی های استفاده از آنها بیندازیم:
هدف |
||
اولین روز قرن |
||
YEAR یا YYYY |
اولین روز سال |
|
یا YY یا Y |
||
روز اول سه ماهه |
||
MONTH یا MON |
روز اول ماه |
|
همان روز هفته با روز سال جاری |
||
همان روز هفته با روز ماه جاری |
||
DAY یا DY یا D |
روز اول هفته |
|
HH، یا HH12، یا |
||
تابع TO_DATE (str[,mask [,nls_lang]])
تابع TO_DATE رشته رشته را به تاریخ تبدیل می کند. اگر مشخص شده باشد، تغییر شکل طبق ماسک ماسک انجام می شود. اگر ماسک مشخص نشده باشد، ماسک پیش فرض گرفته می شود. اگر یک ماسک را مشخص کنید، می توانید یک پارامتر دیگر را مشخص کنید - زبانی که هنگام قالب بندی نام ماه ها و روزها استفاده می شود. در صورت خطا در تجزیه رشته str مطابق با داده شده
ماسک بوجود می آید استثنا. رایج ترین خطا "ORA-01830: الگوی قالب تاریخ قبل از تبدیل کل رشته ورودی کامل می شود" است. علاوه بر این، خطای "ORA-01821: فرمت تاریخ شناسایی نشد" غیر معمول نیست - زمانی رخ می دهد که یک ماسک فرمت نامعتبر مشخص شده باشد. مثال:
SELECT T0_DATE("09/12/2006") d
از دوگانه
تابع TO_CHAR(d[,mask])
تاریخ d را با توجه به ماسک داده شده به یک رشته کاراکتر تبدیل می کند. اگر یک ماسک نامعتبر مشخص شده باشد، استثنا "ORA-01821: قالب تاریخ شناسایی نشد" پرتاب می شود. مثال:
SYSDATE d1 را انتخاب کنید،
TOLCHAR (SYSDATE، "DD.MM.YY HH24:MI") d2
از دوگانه
در ابتدا قصد نداشتم مقاله ای در مورد تاریخ بنویسم، اما قرار بود فقط به یک موضوع در مورد این موضوع بپردازم. با این حال ، در طول کار ، لازم بود تا موارد مختلفی را برجسته کنیم ویژگی های اضافیاوراکل، نمونه های جدیدی ظاهر شد. بنابراین بررسی یک موضوع به یک مقاله کوچک تبدیل شده است. امیدوارم با وجود جالب ترین موضوع، خسته کننده نباشد.
بخش اول مقاله که به ویژگی های سفارش توسط اپراتور، عملیات not in و نمونه ای از تبدیل نوع ضمنی اختصاص دارد، قرار گرفته است.
تابع to_date و فرمت های تاریخ
تعداد کمی از برنامه نویسان موضوع قالب بندی را دوست دارند. به عنوان مثال در برخی از دروس مباحث قالب بندی تاریخ و استانداردهای منطقه ای به طور خاص می باشد ساعت های گذشتهروز آخر تمرین، زیرا شنوندگان خسته هستند دلیل فراوانی فرمت های موجودبا استفاده نسبتا نادر آنها در وظایف استاندارد. رایج ترین استفاده از ماسک ها در سه عملکرد است: to_number، to_char و to_date. در هر سه مورد، ماسک در رتبه دوم قرار دارد. پارامتر اختیاری. و اگر تعداد ماسکهای کم و بیش معقولی برای قالببندی اعداد وجود داشته باشد، ماسکهای زیادی برای قالببندی تاریخها به اضافه پسوندها و اصلاحکنندهها وجود دارد.مطمئناً در دسترس بودن تعداد زیادیماسک است لحظه مثبت، چون امکانات را گسترش می دهد، برای مثال، می توانید با استفاده از ماسک "DDD" که تعداد روز در سال را برمی گرداند، بررسی کنید که آیا 13 سپتامبر 2011 روز برنامه نویس است یا خیر:
--Query #1 به_char(to_date("09/13/2011")،"DDD") "Programmers day" از دوگانه را انتخاب کنید.
علیرغم مزایای آشکار قالب بندی، من قصد نداشتم مروری بر قالب های تاریخ و نمونه هایی از استفاده از ماسک های عجیب و غریب در قسمت دوم مقاله بگذارم. اولا، بعید است که این مورد برای کسی جالب باشد، و ثانیا، نویسنده همچنین طرفدار زیادی از قالب بندی پیچیده نیست، زیرا به ندرت از آن در زندگی استفاده می کند. تنها دلیل ظاهر این بخش- برخی سوالاتی که از خوانندگان در مورد استفاده از قالب RR ایجاد شده است.
قبل از اینکه مستقیماً به موضوع اصلی بخش بروید، اجازه دهید به چند مورد نگاه کنیم نمونه های غیر استانداردکار با خرما
مثال شماره 1. استفاده از قالب های کوتاه شده
بیا شروع کنیم با قالب بندی استاندارد. بگذارید تاریخ امروز 1390/09/16 باشد، آیا کوئری های زیر اجرا می شوند و چه چیزی را برمی گرداند؟
--Query #2 به_char(sysdate، "YYYY") از dual را انتخاب کنید. --Query #3 select to_date("03", "DD") from dual;
پرس و جو شماره 2 یک مثال معمولی برای تبدیل تاریخ به رشته و ریختن آن به آن است فرمت مورد نظر. تنها تفاوت این است که به جای ماسک های آشناتر مانند "DD.MM.YY" یا "DD-MON-YYYY" از ماسکی استفاده کردیم که فقط سال را مشخص می کند. پرس و جو شماره 2 موفق خواهد شد و سال جاری را در قالب چهار رقمی برمی گرداند. "2011".
پرس و جو شماره 3 کمی جالب تر است، این یک نمونه معمولی از تبدیل صریح یک رشته به تاریخ با ماسک قالب کوتاه است، بنابراین از نقطه نظر نحو، پرس و جو درست است و موفق خواهد شد. موضوع مهمتر نتیجه اجرای آن است، یعنی. اگر فقط روز داده شود چه تاریخی برمی گردد؟ قبل از جواب دادن این سوالبیایید به یاد بیاوریم که اوراکل چگونه زمان را تنظیم می کند، اگر به صراحت تنظیم نشده باشد:
--Query #4 to_char(to_date("02/03/2011", "DD.MM.YYYY") "DD.MM.YYYY HH24:MI:SS") را از dual انتخاب کنید. --Query #5 to_char(to_date("02/03/2011 30", "DD.MM.YYYY MI") "DD.MM.YYYY HH24:MI:SS") از dual;
در درخواست شماره 4، زمان مشخص نشده است، در درخواست شماره 5، فقط تعداد دقیقه ها مشخص شده است، ساعت ها و ثانیه ها حذف شده اند. قانونی در اوراکل وجود دارد که بر اساس آن، اگر مؤلفه زمانی در تاریخ وجود نداشته باشد، در صورتی که فقط بخشی از عناصر زمانی مشخص شده باشد، زمان به طور خودکار روی 00:00:00 (یعنی نیمه شب) تنظیم می شود. پرس و جو شماره 5)، سپس عناصر از دست رفته روی 00 تنظیم می شوند. بنابراین، پرس و جو شماره 4 رشته "02/03/2011 00:00:00" را برمی گرداند و پرس و جو شماره 5 "02/03/2011 00" را برمی گرداند. :30:00"
بیایید به سوال شماره 3 برگردیم، آیا درست است؟ این قانونبرای خرما، یعنی آیا عناصر تاریخ موجود در تبدیل با 00 یا 01 جایگزین شده اند؟ بله، آنها جایگزین شده اند، اما نه همه، به طور دقیق تر، برای عناصر تاریخ از دست رفته، از مقادیر sysdate (اولین روز ماه جاری سال جاری) استفاده می شود. بنابراین، پرس و جو شماره 3 از 09 به عنوان ماه و 2011 به عنوان سال استفاده می کند، بنابراین نتیجه پرس و جو 09/03/2011 خواهد بود.
مثال شماره 2. ترتیب گزینه های قالب بندی
آیا کوئری زیر اجرا می شود و اگر چنین است، چه تاریخی برمی گردد؟
--Query #6 to_date("20092011", "YYYYDDMM") را از dual انتخاب کنید.
در نگاه اول، عدم وجود جداکننده در رشته تاریخ ممکن است عامل مهمی ناسازگار با اجرای پرس و جو به نظر برسد، با این حال، ماسک تاریخ نیز بدون جداکننده مشخص شده است و رشته ای که باید تبدیل شود با الگوی مشخص شده مطابقت دارد. بنابراین، پرس و جو شماره 6 موفق خواهد شد و 2009/11/20 برمی گردد (فرمت نتیجه ممکن است بسته به تنظیمات جلسه کمی متفاوت باشد). در مثال زیر به مسائل مربوط به جداکننده ها با جزئیات بیشتری نگاه خواهیم کرد.
مثال شماره 3. تبدیل ضمنی
--Query #7 months_between("1\Sep-9","01$Oct/08") را از dual انتخاب کنید.
که در درخواست داده شدهدو پارامتر رشته مشخص شده است که باید با استفاده از تبدیل ضمنی به تاریخ تبدیل شوند. با توجه به مستندات، هنگام استفاده از قالبهای پیشفرض، رشتهای که به طور ضمنی به تاریخ تبدیل میشود باید با الگوی زیر مطابقت داشته باشد: separator1 separator2. شما می توانید از اکثر جداکننده ها به عنوان separator1 و separator2 استفاده کنید شخصیت های خاص، شامل فاصله ها، برگه ها، و "و double نقل قول تک"". علاوه بر این، اگر رشته حاوی حداقل دو رقم برای تعیین روز، ماه و سال باشد، جداکننده را می توان به طور کلی حذف کرد. مثلا:
--Query #8 select to_date ("September 0109") from dual; --Query #9 to_date("01Sep09") را از دوگانه انتخاب کنید. --Query #10 برای این پرس و جو، فرمت تاریخ پیش فرض باید DD.MM.RR select to_date("010909") از dual باشد.
از آنجایی که هر دو رشته مشخص شده در کوئری شماره 7 با الگوی داده شده مطابقت دارند، کوئری موفق خواهد شد و عدد 11 را برمی گرداند.
مثال شماره 4. پارامترهای تابع to_date
اجازه دهید قالب پیشفرض تاریخ DD.MON.RR باشد و زبان تاریخ روسی باشد، پرس و جوی زیر کار میکند:
--Query #11 to_date(sysdate,"mm/dd/yyyy hh24:mi:ss") را از دوگانه انتخاب کنید.
درخواست مشابهی در یکی از بحث ها در صفحه ask Tom ظاهر شد. تله پرس و جو این است که ما سعی می کنیم یک تاریخ (sysdate) را به یک تاریخ تبدیل کنیم. اگر درخواست به این شکل بود:
--Query #12 انتخاب to_char(sysdate,"mm/dd/yyyy hh24:mi:ss") از dual;
آن اجرا موفق خواهد شد و رشته "09/15/2011 23:00:11" را برمی گرداند. با این حال، تابع to_date یک رشته را به عنوان پارامتر اول خود انتظار دارد، بنابراین تاریخ ابتدا به طور ضمنی به یک رشته تبدیل میشود (که معادل فراخوانی to_char (sysdate) با یک ماسک پیشفرض است). نتیجه این تبدیل رشته "09/15/11" است، سپس تماس to_date برقرار می شود. بنابراین پرس و جو شماره 11 معادل پرس و جو زیر است:
--Query #13 select to_date("09/15/11","mm/dd/yyyy hh24:mi:ss") از dual;
از آنجایی که مشاهده آن دشوار نیست، درخواست شماره 13 قابل اجرا نیست، زیرا رشته "09/15/11" با ماسک تنظیم مطابقت ندارد، به ترتیب درخواست شماره 11 نیز قابل اجرا نیست.
تنظیم قالب پیش فرض تاریخ
قالب پیشفرض تاریخ با دو پارامتر تنظیم میشود: NLS_DATE_FORMAT (مسئول خود قالب) و NLS_DATE_LANGUAGE (مسئول زبانی است که هنگام نوشتن نام روزها، ماهها و غیره استفاده میشود). اگر این پارامترها به طور صریح تنظیم نشده باشند، مقادیر آنها بر اساس پارامتر NLS_LANG تنظیم می شود.
سه سطح وجود دارد که می توانید قالب تاریخ را در آنها تنظیم کنید:
- سطح DB: * از nls_database_parameters را انتخاب کنید که در آن پارامتر در ("NLS_DATE_FORMAT"، "NLS_DATE_LANGUAGE") است. پارامترهای این سطح هنگام ایجاد پایگاه داده تنظیم شده و در فایل init.ora نوشته می شود.
- سطح نمونه: * را از بین nls_instance_parameters انتخاب کنید که در آن پارامتر در ("NLS_DATE_FORMAT"، "NLS_DATE_LANGUAGE"); پارامترهای این سطح در هنگام راه اندازی نمونه تنظیم می شوند و با استفاده از دستور ALTER SYSTEM قابل تغییر هستند.
- سطح جلسه: * از nls_session_parameters را انتخاب کنید که در آن پارامتر در ("NLS_DATE_FORMAT"، "NLS_DATE_LANGUAGE")؛ پارامترهای این سطح را می توان با دستور ALTER SESSION تغییر داد. همچنین، مقدار این پارامترها را می توان با استفاده از پرس و جو بررسی کرد: SYS_CONTEXT ("USERENV"، "NLS_DATE_FORMAT")، SYS_CONTEXT ("USERENV"، "NLS_DATE_LANGUAGE") را از دوگانه انتخاب کنید.
مثال شماره 5. فرمت DD.MM.RR در مقابل DD-MON-RR
من انگیزه داشتم که به قالب بندی پیش فرض تاریخ ها به دلیل برخی موارد عجیب و غریب در تبدیل ضمنی رشته ها به تاریخ توجه کنم. در نظر بگیریم مثال بعدی:
--Query #14 --تنظیم فرمت تاریخ پیش فرض تغییر مجموعه جلسه NLS_DATE_FORMAT="DD.MM.RR"; --تنظیم تنظیم پیش فرض تغییر زبان تاریخ مجموعه جلسه NLS_DATE_LANGUAGE="AMERICAN"; - مقدار پارامترهای جلسه را بررسی کنید * از nls_session_parameters که پارامتر در ("NLS_DATE_FORMAT"، "NLS_DATE_LANGUAGE") انتخاب شود. --تبدیل رشته ها به تاریخ select to_date("9/11/11") از dual; to_date("11.SEP.11") را از dual انتخاب کنید.
منطقی است که فرض کنیم تبدیل رشته "09/11/11" به تاریخ انجام خواهد شد، اما رشته "11.SEP.11" موفق نخواهد شد. با این حال، این مورد نیست، هر دو تبدیل موفق خواهند شد. در ابتدا، من فرض کردم که اگر تبدیل رشته با استفاده از ماسک جلسه غیرممکن باشد، اوراکل سعی می کند از ماسک های سطوح دیگر استفاده کند (من ماسک سطح پایگاه داده را روی "DD-MON-RR" تنظیم کرده ام). مطالعه مستندات نشان داد که اینطور نیست و اوراکل بر اساس اصولی که در پاراگراف قبل توضیح داده شد هدایت می شود.
بیایید مثال دیگری را امتحان کنیم:
--Query #15 --تنظیم فرمت تاریخ پیش فرض تغییر مجموعه جلسه NLS_DATE_FORMAT="DD.MON.RR"; --تنظیم تنظیم پیش فرض تغییر زبان تاریخ مجموعه جلسه NLS_DATE_LANGUAGE="AMERICAN"; - مقدار پارامترهای جلسه را بررسی کنید * از nls_session_parameters که پارامتر در ("NLS_DATE_FORMAT"، "NLS_DATE_LANGUAGE") انتخاب شود. --تبدیل رشته ها به تاریخ select to_date("9/11/11") از dual; to_date("11.SEP.11") را از dual انتخاب کنید.
اگر فکر می کنید که نتیجه با درخواست قبلی یکسان است، در اشتباه هستید. یکی از تحولات شکست خواهد خورد. که در این موردرشته "11.09.11" با الگو مطابقت ندارد. شاید عارف باشد؟
متاسفانه نه. خواندن مستندات نشان داد که قوانینی برای تصحیح خودکار عناصر قالببندی تاریخ وجود دارد. در زیر جدول جایگزین ها آمده است.
عنصر فرمت اصلی | عناصر فرمت اضافی برای امتحان به جای اصلی |
---|---|
"MM" | "MON" و "MONTH" |
"مون | "ماه" |
"ماه" | "مون" |
"YY" | "YYYY" |
"RR" | "RRRR" |
مثال شماره 6. فرمت RR در مقابل YY
اکثر کاربران به خوبی از تفاوت های ماسک های RR و YY آگاه هستند، اما کسانی هستند که این اطلاعاتمفید ثابت خواهد شد بیایید مستقیم به یک مثال برویم. چه داده هایی با پرس و جوهای زیر بازگردانده می شوند:
--Query #16 to_date("11","RR") "RR", to_date("11","YY") "YY" از dual را انتخاب کنید. --Query #17 to_date("99","RR") "RR", to_date("99","YY") "YY" از dual را انتخاب کنید.
هر دو پرسوجوی فوق موفق خواهند شد و تاریخها را طبق قوانینی که در مثال شماره 1 برای پرس و جو شماره 3 شرح داده شده است، برمیگردانند. بنابراین، مقدار روز در تمام تاریخ های دریافتی 01 و مقدار ماه 09 خواهد بود (اگر پرس و جو را در سپتامبر اجرا کنید). سوال اصلی، ارزش سال چقدر خواهد بود؟
همانطور که به راحتی می توان حدس زد، در درخواست شماره 16، منظور من از "11" سال 2011 بود و هر دو ماسک آن را به من برگرداندند، یعنی. نتیجه پرس و جو شماره 16 09/01/2011 و 09/01/2011 است.
در پرس و جو شماره 17، منظور من از "99" سال 1999 بود، و در اینجا نظرات ماسک ها تقسیم شد: ماسک RR سال مورد انتظار 1999 را برگرداند و ماسک YY سال 2099 را برگرداند، یعنی. نتیجه پرس و جو شماره 17 1999/09/01 و 2099/09/01 است.
بیایید ببینیم که چگونه این عناصر قالب بندی با جزئیات بیشتر کار می کنند:
--Query #18 select to_date("00", "RR") "00", to_date("49"""RR") "49", to_date("50"""RR") "50", to_date( "99"، "RR") "99" از دوتایی همگی to_date("00"،"YY") "00", to_date("49"،"YY") "49"، to_date("50", "YY") "50", to_date("99","YY") "99" از دوگانه;
همانطور که از درخواست شماره 18 می بینید، تفاوت در عملکرد ماسک ها از دهه 50 شروع می شود، یعنی. فرمت YY همیشه سال را در قرن جاری و RR سال را برمیگرداند<50 воспринимает как год текущего столетия, а год >سال 50 مانند سال قرن گذشته است. در واقع مقادیر to_date("99", "RR") = 1999 و to_date ("00", "RR") = 2000 تنها در صورتی صحیح هستند که تاریخ فعلی کمتر از 2051 باشد، پس از آن to_date("99"، "RR" ) = 2099 و to_date("00","RR") = 2100. اگر می خواهید آزمایش کنید، می توانید زمان سرور را به 2051 تغییر دهید و ببینید نتیجه پرس و جو شماره 18 چگونه تغییر می کند، فقط این کار را نکنید. آن را در سیستم های زنده! اگر زمان سرور تغییر کند، sysdate تغییر می کند و بهتر است به این فکر نکنید که در همه گزارش ها، جداول گزارش و غیره چه سردردی خواهید داشت. قوانین عمومیتبدیل یک سال دو رقمی به سال چهار رقمی با استفاده از فرمت RR به صورت زیر است:
اگر سال دو رقمی مشخص شده 00 تا 49 باشد، پس
- اگر دو رقم آخر سال جاری 00 تا 49 باشد، سال برگشتی است داردهمان دو رقم اول سال جاری
- اگر دو رقم آخر سال جاری 50 تا 99 باشد، آنگاه 2 رقم اول سال برگشتی 1 بزرگتر از 2 رقم اول سال جاری است.
- اگر دو رقم آخر سال جاری 00 تا 49 باشد، 2 رقم اول سال برگشتی 1 کمتر از 2 رقم اول سال جاری است.
- اگر دو رقم آخر سال جاری 50 تا 99 باشد، سال برگشتی همان دو رقم اول سال جاری را دارد.
--Query #19 select to_date("1950","RR") "50RR", to_date("1950","YY") "50YY" from dual;
بنابراین پرس و جو شماره 19 در هر دو مورد 1950 را برمی گرداند.
مثال شماره 7. چند نمونه دیگر
در پایان بررسی، اجازه دهید کمی عجیب و غریب را در نظر بگیریم. آیا در نتیجه اجرای کوئری زیر خطایی رخ خواهد داد:
--Query #20 DATE "1928-12-25" را از دوگانه انتخاب کنید.
اگر تصمیم گرفتید که این یک ورودی بی معنی است، اشتباه می کنید - این یک تاریخ کاملاً صحیح مطابق با استاندارد ANSI است، پرس و جو شماره 20 موفق خواهد شد و 1928/12/25 برمی گردد.
کدام یک از درخواست ها با شکست مواجه می شود؟
--Query #21 to_date("1998-JAN-25 17:30"،"YYYY-MON-DD HH24:MI"،"NLS_DATE_LANGUAGE=AMERICAN") از دوگانه انتخاب کنید. --Query #21 select to_date("1998-JAN-25 17:30"،"YYYY-MON-DD HH24:MI"،"NLS_DATE_LANGUAGE=RUSSIAN") از dual;
این مثال برای نشان دادن وجود پارامتر سوم در تابع to_date در نظر گرفته شده است. این پارامتربه شما امکان می دهد مقدار یکی از پارامترهای NLS (پشتیبانی زبان ملی) را فقط برای این فراخوانی به تابع to_date تنظیم کنید. تنظیم پارامترهای NLS برای جلسه، در مثال شماره 5 در نظر گرفتیم. تفاوت کلیدی بین پرس و جوهای #20 و #21 در نام ماه نیست (ماسک MON به طور خودکار با ماسک MONTH جایگزین می شود، همانطور که در مثال شماره 5 توضیح داده شد)، بلکه در نشانه است. زبانهای مختلفتاریخ. درخواست شماره 21 انتظار نام ماه را به زبان انگلیسی دارد و بر این اساس، اجرا نمی شود، درخواست شماره 22 نام ماه را به زبان روسی انتظار دارد و با موفقیت اجرا می شود.
چه زمانی اعلان جدول زیر باعث ایجاد خطا در هنگام درج داده می شود؟
--Query #23 ایجاد جدول برای_تست (یک عدد، تاریخ b پیشفرض to_date("09/11/2011")).
هر بار جلسه ای با فرمت تاریخ پیش فرض "DD.MON.RR" فقط با مقدار درج ستون اول در مقادیر for_test(a) (1) وارد می شود. خطایی رخ خواهد داد
ویژگی های نمایش تاریخ در اپلیکیشن های مختلف
چه چیزی بر نمایش تاریخ تأثیر می گذارداین بخش پس از انتشار مقاله با توجه به توصیه های ذکر شده در نظرات اضافه شد. موارد زیر هم برای نمایش تاریخ و هم برای نمایش اعداد صادق است. ممکن است زمانی که برخی از مثالهای بالا را در مقاله اجرا میکنید، تاریخهایی را در قالبی متفاوت از آنچه در نتایج نشان داده شده بود دریافت کرده باشید. اگر تنظیمات جلسه شما با موارد مشخص شده در مثال ها مطابقت داشت، حداقل عجیب به نظر می رسد.
حقیقت این است که هنگام اجرای یک کوئری
- درخواست شماره 24 sysdate را از dual انتخاب کنید. شما یک تاریخ دریافت می کنید، اما برای نمایش نتیجه روی صفحه، ابزار خاصی که با آن به پایگاه داده دسترسی دارید باید تاریخ را به یک رشته تبدیل کند. بنابراین، برای نمایش تاریخ ها (و اعداد)، to_char به طور ضمنی نامیده می شود، یعنی. ما یک مورد کلاسیک تبدیل ضمنی داریم (این یک تبدیل فقط برای نمایش روی صفحه است، نتایج آن در هیچ محاسباتی شرکت نمی کند و بر چیزی غیر از نمایش داده ها تأثیر نمی گذارد). اگر تبدیل ضمنی وجود داشته باشد، ماسکی نیز وجود دارد که توسط آن انجام می شود. در مورد کلاسیک، این باید باشدماسک تنظیم شده برای جلسه، i.e. ماسک مشخص شده در پارامتر NLS_DATE_FORMAT جدول nls_session_parameters، که در طول مقاله به طور گسترده با آن کار کردیم.
بیایید برخی از برنامه ها را آزمایش کنیم. ما با استفاده از اسکریپت زیر بررسی خواهیم کرد:
--Query #25 --بررسی پارامترهای جلسه پیش فرض * از nls_session_parameters که در آن پارامتر در ("NLS_DATE_FORMAT"،"NLS_DATE_LANGUAGE") انتخاب کنید. -تاریخ خروجی sysdate را از دوگانه انتخاب کنید. --تغییر پارامترهای جلسه پیش فرض تغییر مجموعه جلسات NLS_DATE_FORMAT="DD.MON.RR hh24:mi:ss"; -تاریخ خروجی sysdate را از دوگانه انتخاب کنید.
بیایید بررسی کنیم sqlplus از چه پارامترهایی برای نمایش تاریخ ها استفاده می کند.
برنج. 1. نتیجه پرس و جو شماره 25 در sqlplus.
همانطور که از شکل 1 می بینید، قالب نمایش تاریخ بسته به تنظیمات جلسه تغییر می کند. sqlplus از تنظیمات جلسه استفاده می کند. این امر درک فرآیند تبدیل تاریخ به رشته و برگشت را آسانتر میکند، زیرا از همان ماسکها هم برای تبدیل و هم برای نمایش استفاده میشود.
برخی از ابزارهای توسعه پیشرفته از تنظیمات NLS خود استفاده می کنند که به تنظیمات اوراکل مربوط نمی شود. به عنوان مثال، اجازه دهید بررسی کنیم که PL/SQL Developer از چه گزینه هایی برای نمایش تاریخ ها استفاده می کند. برای این کار کوئری شماره 25 را در آن اجرا می کنیم.
برنج. 2. نتیجه پرس و جو شماره 25 در PL/SQL Developer.
همانطور که از شکل 2 مشاهده می شود، با تغییر تنظیمات جلسه، فرمت نمایش تاریخ تغییر نمی کند. علاوه بر این، اگر دقت کنید، می بینید که هر دو نتیجه اول و دوم نمایش تاریخ بر روی صفحه نمایش با پارامترهای جلسه مطابقت ندارند (در حالت اول، تاریخ نمایش داده شده دارای یک سال در قالب چهار رقمی است و ماسک سال را در قالب دو رقمی نشان می دهد). این بدان معنی است که ابزار از تنظیمات NLS خود استفاده می کند، در مورد PL/SQL Developer، مکان آنها در شکل نشان داده شده است. 3.
برنج. 3. تنظیم پارامترهای NLS برای نمایش تاریخ در PL/SQL Developer.
چگونه تنظیمات ابزار NLS می تواند مضر باشد
نمایش تاریخ در قالبی غیر از فرمت جلسه به یک دلیل مضر است - کاربر را گمراه می کند و می تواند منجر به خطا شود. کوئری زیر را در sqlplus و PL/SQL Developer اجرا کنید:
--درخواست شماره 26 --تغییر پارامترهای جلسه پیش فرض تغییر مجموعه جلسات NLS_DATE_FORMAT="DD.MON.RR hh24:mi:ss"; -تاریخ خروجی sysdate را از دوگانه انتخاب کنید. --تلاش برای تبدیل داده های دریافتی از پرس و جو قبلی به تاریخ انتخاب to_date(ХХХХХХХХ) از dual. در خط آخر پرس و جو به جای XXXXXXXXXX، دریافتی از را درج می کنیم خط قبلیداده ها.
نتایج اجرای پرس و جو در شکل های زیر نشان داده شده است.
برنج. 4. نتیجه پرس و جو شماره 26 در sqlplus.
برنج. 5. نتیجه اجرای کوئری شماره 26 در PL/SQL Developer.
چرا در sqlplus داده های نمایش داده شده روی صفحه با موفقیت به تاریخ تبدیل شد، اما داده های نمایش داده شده روی صفحه توسط PL/SQL Developer قابل تبدیل نبود؟ زیرا اوراکل از فرمت داده مشخص شده در جلسه برای تبدیل استفاده می کند و خروجی داده توسط PL / SQL Developer برای نمایش در فرمت خاص خود متفاوت از فرمت جلسه آورده شده است.
نتیجه
به عنوان یک نتیجه، می خواهم به شما یادآوری کنم که تقریباً در هر پست در مورد کار با تاریخ، تام کیت در مورد نیاز به استفاده از تبدیل های صریح و نشان اجباری ماسک صحبت می کند. "هنگام تبدیل یک رشته به تاریخ، هرگز به فرمت تاریخ پیش فرض تکیه نکنید، همیشه ماسک را به صراحت تنظیم کنید" - چیزی شبیه به این مانند کلمات او به نظر می رسد. نمونه های اضافی و اشتباهات احتمالیهنگام کار با تبدیل تاریخ، می توانید آن را با استفاده از صفحه درخواست تام پیدا کنید.از آنجایی که کار با تاریخ ها کل مقاله را در بر گرفت، بسیاری از سوالات جالبکه می خواهم در نظر بگیرم. به احتمال زیاد به محض اینکه وقت آزاد داشته باشم قسمت سوم مقاله ظاهر خواهد شد.
در مقاله قبلی، توابع داخلی کار با رشته ها را بررسی کردیم. در این مقاله ما صحبت خواهیم کرددر مورد توابع کار با تاریخ/زمان و توابع تبدیل انواع برای تاریخ. Oracle نوع خاصی از DATE را برای ذخیره تاریخ و زمان ارائه می دهد. از نظر فیزیکی، این یک عدد کسری است که قسمت صحیح آن تعداد روزها را از یک تاریخ پایه ذخیره می کند و قسمت کسری زمان را ذخیره می کند. این به شما امکان می دهد تا عملیات حسابی را در تاریخ ها انجام دهید - جمع و تفریق.
تابع SYSDATE
این یکی از متداول ترین توابع است که برمی گرداند تاریخ فعلیو زمان با توجه به ساعت سرور
تابع LAST_DAY(d).
آخرین روز ماه مشخص شده در تاریخ d را برمی گرداند.
SELECT SYSDATE d،
LAST_DAY (SYSDATE) d1
تابع MONTHS_BETWEEN(d1, d2)
تابع MONTH_BETWEEN تعداد ماه های بین دو تاریخ d1 و d2 را که به صورت d1-d2 امضا شده اند، برمی گرداند، عدد برگشتی یک کسری است.
SELECT MONTHS_BETWEEN("2.09.2006", "2.05.2006") d1,
MONTHS_BETWEEN("09/12/2006"، "05/2/2006") d2،
MONTHS_BETWEEN("2.05.2006"، "12.09.2006") d3
در نظر گرفتن نمونه های معمولی- تاریخ را به ساعت، روز، ماه و سال کوتاه کنید. ماسک فرمت پیش فرض "DD" است
SYSDATE d1 را انتخاب کنید،
TRUNC(SYSDATE، "HH24") d2،
TRUNC(SYSDATE، "DD") d3،
TRUNC(SYSDATE، "MM") d4،
TRUNC(SYSDATE، "YYYY") d5
قالببندی ماسکها برای توابع TRUNC و ROUND معتبر است
بیایید نگاهی دقیق تر به فرمت ماسک ها و ویژگی های کاربرد آنها بیندازیم.
ماسک |
هدف |
اولین روز قرن |
|
YEAR یا YYYY یا YY یا Y |
اولین روز سال |
روز اول سه ماهه |
|
MONTH یا MON یا MM |
روز اول ماه |
همان روز هفته با اولین روز سال جاری |
|
همان روز هفته با روز اول ماه جاری |
|
DAY یا DY یا D |
روز اول هفته |
HH یا HH12 یا HH24 |
|
تابع TO_DATE (str[,mask [,nls_lang]])
تابع TO_DATE رشته رشته را به تاریخ تبدیل می کند. اگر مشخص شده باشد، تغییر شکل طبق ماسک ماسک انجام می شود. اگر ماسک مشخص نشده باشد، ماسک پیش فرض گرفته می شود. اگر یک ماسک را مشخص کنید، می توانید یک پارامتر دیگر را مشخص کنید - زبانی که هنگام قالب بندی نام ماه ها و روزها استفاده می شود. اگر خطایی در تجزیه رشته رشته مطابق با ماسک مشخص شده وجود داشته باشد، یک استثنا ایجاد می شود. رایج ترین خطا "ORA-01830: الگوی قالب تاریخ قبل از تبدیل کل رشته ورودی کامل می شود" است. علاوه بر این، خطای "ORA-01821: فرمت تاریخ شناسایی نشد" غیر معمول نیست - زمانی رخ می دهد که یک ماسک فرمت نامعتبر مشخص شده باشد.
SELECT TO_DATE("09/12/2006") d
قالببندی ماسکها برای توابع TO_CHAR در صورت قالببندی تاریخ معتبر است
یک قرن، با علامت منفی قبل از تاریخ ق.م.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE-1000000، "SCC") d2
26.09.2006 17:14:21 |
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "YYYY") d2
سال نوشته شده در کلمات با در نظر گرفتن زبان ملی فعلی.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "YEAR") d2
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "MM") d2
نام ماه به زبان
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "MONTH") d2
هفته از سال
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "WW") d2
روز سال.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "DDD") d2
روز هفته با کلمات، در صورت لزوم به 9 کاراکتر با فاصله اضافه می شود.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "DAY") d2
تاریخ تقویم جولیان تعداد روزهای 01/01/4712 ق.م است.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "J") d2
ساعت از روز در مقیاس 12 ساعته (1-12).
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "HH") d2
دقایق (0-59).
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "MI") d2
این ماسک فرمت برای اندازه گیری فواصل زمانی در ثانیه مفید است.
علائم نگارشی آنها به مکان های مناسب در تاریخ فرمت شده خروجی می شوند.
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "DD.MM.YYYY HH24.MI") d2،
TO_CHAR (SYSDATE، "DD/MM/YYYY HH12.MI PM") d3
قالب بندی عناصر ماسک در نظر گرفته شده برای خروجی اطلاعات متنی, حساس به حروف بزرگ - حروف بزرگ و کوچک حروف متن قالب بندی شده را کنترل می کند. مدیریت ثبت نام را با استفاده از ماسک فرمت DAY به عنوان مثال در نظر بگیرید:
SYSDATE d1 را انتخاب کنید،
TO_CHAR (SYSDATE، "DAY") d2،
TO_CHAR (SYSDATE، "روز") d3،
TO_CHAR (SYSDATE، "روز") d4
26.09.2006 17:47:45 |
به راحتی می توان فهمید که اگر ماسک با حروف بزرگ نوشته شده باشد، فرمت شده است مقدار متنبا حروف بزرگ برمی گرداند اگر در پایین باشد - مقدار قالب بندی شده نیز در پایین خواهد بود. و در نهایت نوشتن ماسک با حرف بزرگباعث می شود متن تولید شده طوری قالب بندی شود که با یک حرف بزرگ شروع شود.
نتیجه
در این مقاله تمام توابع اصلی داخلی Oracle برای کار با تاریخ و انجام عملیات تبدیل نوع با نوع "تاریخ" را پوشش داده ایم. در مقاله بعدی، به توابع تبدیل و قالب بندی اعداد نگاه می کنیم و به پرس و جوهای عملی می رویم که از توابعی که قبلاً بحث شد استفاده می کنند.
اوراکل مجموعه ای از توابع را برای کار با مقادیر تاریخ/زمان پیاده سازی می کند. ما به جزئیات در مورد تمام توابع نمی پردازیم، اما خلاصه در جدول. 1 شما را معرفی می کند فرصت های موجود. اگر به هر یک از ویژگی ها علاقه مند هستید، لطفا تماس بگیرید توصیف همراه با جزئیاتبه دایرکتوری Oracle SQLمرجع.
از استفاده سنتی خودداری کنید توابع اوراکل، هنگام کار با انواع داده های جدید TIMESTAMP، مقادیر DATE را مدیریت می کند. درعوض، تا حد امکان از توابع جدید برای انواع INTERVAL استفاده کنید. و توابع DATE فقط باید برای پردازش مقادیر از نوع DATE استفاده شوند.
بسیاری از موارد ارائه شده در جدول. 1 تابع (از جمله ADD_MONTHS) مقادیر DATE را دریافت می کند. هنگام استفاده از چنین توابعی با انواع داده های جدید TIMESTAMP ممکن است مشکلاتی ایجاد شود. اگرچه به هر یک از این توابع می توان مقداری از نوع TIMESTAMP ارسال کرد، اوراکل به طور ضمنی آن را به نوع DATE تبدیل می کند و تنها در این صورت تابع وظیفه خود را انجام می دهد، به عنوان مثال:
TS TIME MAG با منطقه زمانی را اعلام کنید. BEGIN ts:= SYSTIMESTAMP; --توجه داشته باشید که مقدار متغیر ts بر روی --کسری ثانیه و منطقه زمانی تنظیم شده است. DBMS_OUTPUT.PUT_LINE(ts); - مقدار ts را در یکی از توابع داخلی تغییر دهید. ts:= LAST_DAY(ts); -- ثانیه های کسری از دست می روند و منطقه زمانی با منطقه زمانی جلسه -- جایگزین می شود. DBMS_OUTPUT.PUT_LINE(ts); پایان؛
نتیجه:
نام | شرح |
ADD_MONTHS | مقدار DATE حاصل از افزایش را برمیگرداند مقدار را تنظیم کنید DATE برای تعداد ماه های معین. به جمع و تفریق فواصل مراجعه کنید |
قالب | تبدیل بین انواع داده را انجام می دهد - به عنوان مثال، بین DATE و معانی مختلف TIMESTAMP . به "CAST and EXTRACT" مراجعه کنید |
تاریخ فعلی | تاریخ و زمان فعلی را در منطقه زمانی جلسه به عنوان مقدار DATE برمیگرداند |
CURRENT_TIMESTAMP | تاریخ و زمان فعلی را در منطقه زمانی جلسه به عنوان مقداری از نوع TIMESTAMP WITH TIME ZONE برمیگرداند |
DBTIMEZONE | فاصله منطقه زمانی پایگاه داده را از UTC به عنوان یک رشته کاراکتر برمی گرداند (به عنوان مثال، "-05:00"). منطقه زمانی پایگاه داده فقط هنگام کار با مقادیر از نوع TIMESTAMP WITH LOCAL TIME ZONE استفاده می شود. |
استخراج کردن | یک مقدار NUMBER یا VARCHAR2 حاوی عنصر تاریخ/زمان مشخص شده - ساعت، سال، یا مخفف منطقه زمانی را برمیگرداند. به "CAST and EXTRACT" مراجعه کنید |
FROM_TZ | TIMESTAMP و داده های منطقه زمانی را به مقداری از نوع TIMESTAMP WITH TIME ZONE تبدیل می کند |
LAST_DAY | آخرین روز ماه را برای مقدار ورودی داده شده DATE برمی گرداند |
LOCALTIMESTAMP | تاریخ و زمان فعلی را به عنوان مقدار TIMESTAMP در منطقه زمانی محلی برمیگرداند |
MUTHS_ بین | یک مقدار NUMBER حاوی تعداد ماههای بین دو تاریخ را برمیگرداند. به "محاسبه فاصله بین دو مقدار DATE" مراجعه کنید. |
زمان جدید | مقدار DATE را از یک منطقه زمانی به مقدار DATE از منطقه زمانی دیگر تبدیل می کند. این تابع برای حفظ سازگاری با کدهای قدیمی وجود دارد. برنامه های جدید باید از TIMESTAMP با منطقه زمانی یا TIMESTAMP با انواع منطقه زمانی محلی استفاده کنند |
روز بعد | تاریخ اولین روز هفته بعد از تاریخ مشخص شده را برمی گرداند |
NUMTODSINTERVAL | تعداد معینی از روز، ساعت، دقیقه یا ثانیه (به انتخاب شما) را به مقداری از نوع INTERVAL DAY TO SECOND تبدیل می کند. |
NUMTOYMINTERVAL | تعداد معینی از سال ها و ماه ها (به انتخاب شما) را به مقداری از نوع INTERVAL YEAR TO MONTH تبدیل می کند. |
گرد | یک مقدار DATE گرد شده به واحدهای داده شده را برمی گرداند |
SESSIONTIMEZONE | افست منطقه زمانی جلسه (نسبت به UTC) را به عنوان یک رشته کاراکتر برمی گرداند |
SYS_EXTRACT_UTC | مقداری از نوع TIMESTAMP WITH TIME ZONE را به مقدار TIMESTAMP با تاریخ و زمان یکسان تبدیل می کند که به زمان UTC عادی شده است. |
SYSDATE | تاریخ و زمان فعلی سرور Oracle را به عنوان مقدار DATE برمیگرداند |
SYSTIMESTAMP | تاریخ و زمان فعلی سرور Oracle را به عنوان مقداری از نوع TIMESTAMP WITH TIME ZONE برمی گرداند. |
TO_CHAR | مقدار تاریخ/زمان را به رشته کاراکتری تبدیل می کند. به "تبدیل تاریخ و زمان" مراجعه کنید |
به روز | یک رشته کاراکتر را به مقدار DATE تبدیل می کند. به "تبدیل تاریخ و زمان" مراجعه کنید |
TO_DSINTERVAL | یک رشته کاراکتر را به مقداری از نوع INTERVAL DAY TO SECOND تبدیل می کند. به فاصله تبدیل ها مراجعه کنید |
TO_TIMESTAMP | یک رشته کاراکتر را به مقدار TIMESTAMP تبدیل می کند. به "تبدیل تاریخ و زمان" مراجعه کنید |
TO_TIMESTAMP_TZ | یک رشته کاراکتر را به مقداری از نوع TIMESTAMP WITH TIME ZONE تبدیل می کند. به "تبدیل تاریخ و زمان" مراجعه کنید |
TO_YMINTERVAL | یک رشته کاراکتر را به مقداری از نوع INTERVAL YEAR TO MONTH تبدیل می کند. به فاصله تبدیل ها مراجعه کنید |
TRUNC | یک مقدار DATE را برمیگرداند که به واحدهای داده شده کوتاه شده است |
TZ_OFFSET | افست UTC منطقه زمانی را که با نام یا اختصار داده شده است، به شکل VARCHAR2 برمیگرداند (به عنوان مثال، "-05:00") |
در این مثال، متغیر ts حاوی مقداری از نوع TIMESTAMP WITH TIME ZONE است. این مقدار هنگام عبور از LAST_DAY به طور ضمنی به DATE تبدیل میشود. از آنجایی که نوع DATE بخشهای کسری ثانیهها یا افست منطقه زمانی را ذخیره نمیکند، این بخشهای مقدار ts به سادگی کنار گذاشته میشوند. نتیجه LAST_DAY دوباره به ts اختصاص داده می شود که منجر به تبدیل ضمنی دوم می شود - این بار DATE به TIMESTAMP WITH TIME ZONE تبدیل می شود. تبدیل دوم منطقه زمانی جلسه را دریافت میکند، بنابراین ما 05:00 در منطقه زمانی افست در مقدار نهایی را میبینیم.