تسلط بر تابع FORMAT در SQL Server: قالببندی آسان تاریخ، عدد و پول
تابع `FORMAT` در SQL Server یکی از توابع قدرتمند برای تبدیل مقادیر از انواع دادهای مختلف (مانند تاریخ، اعداد و پول) به رشتههای متنی با قالببندی دلخواه است. این تابع که از SQL Server 2012 معرفی شده، امکانات گستردهای را برای نمایش دادهها به شکلی خوانا و کاربرپسند فراهم میکند و به ویژه برای گزارشگیری و نمایش دادهها در فرمتهای خاص بسیار مفید است.
سینتکس کلی تابع `FORMAT` به شرح زیر است:
FORMAT ( value, format [, culture ] )
در این سینتکس:
* `value`: مقداری است که میخواهید آن را قالببندی کنید. این میتواند یک تاریخ، عدد، یا هر نوع داده دیگری باشد که قابلیت تبدیل به رشته را دارد.
* `format`: یک رشته فرمتبندی است که نحوه نمایش `value` را مشخص میکند. این رشته میتواند یک فرمت استاندارد (مانند ‘N’, ‘C’, ‘D’) یا یک فرمت سفارشی مبتنی بر الگوهای داتنت (.NET) باشد.
* `culture` (اختیاری): یک رشته کد فرهنگی است که قواعد منطقهای برای قالببندی (مانند جداکنندههای هزارگان، نماد پول، یا ترتیب نمایش تاریخ) را تعیین میکند. برای مثال، ‘en-US’ برای انگلیسی ایالات متحده یا ‘fa-IR’ برای فارسی ایران.
**قالببندی تاریخ و زمان در SQL Server با تابع FORMAT**
تابع `FORMAT` انعطافپذیری بالایی در نمایش تاریخ و زمان ارائه میدهد. میتوانید تاریخها را به فرمتهای مختلفی مانند “YYYY-MM-DD”، “DD/MM/YYYY” یا حتی به صورت متنی کامل با نام روزها و ماهها نمایش دهید.
برای مثال، نمایش تاریخ جاری با فرمتهای رایج:
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') AS 'تاریخ به فرمت YYYY-MM-DD',
FORMAT(GETDATE(), 'dd/MM/yyyy') AS 'تاریخ به فرمت DD/MM/YYYY',
FORMAT(GETDATE(), 'MMMM dd, yyyy') AS 'تاریخ با نام کامل ماه';
اگر نیاز به اعمال فرهنگهای مختلف برای نمایش تاریخ و زمان دارید، میتوانید پارامتر `culture` را اضافه کنید. این قابلیت برای برنامههای چندزبانه یا بینالمللی بسیار کاربردی است.
نمونهای از قالببندی تاریخ و زمان با در نظر گرفتن فرهنگ (culture):
SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy HH:mm:ss', 'en-US') AS 'تاریخ و زمان آمریکایی',
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy HH:mm:ss', 'fa-IR') AS 'تاریخ و زمان شمسی (فارسی)';
**قالببندی مقادیر عددی در SQL Server**
علاوه بر تاریخ، تابع `FORMAT` برای نمایش اعداد نیز بسیار مفید است. میتوانید اعداد را با تعداد ارقام اعشار مشخص، جداکنندههای هزارگان، یا به صورت درصد و پول قالببندی کنید.
در اینجا چند مثال برای قالببندی اعداد با استفاده از `FORMAT` آورده شده است:
SELECT FORMAT(12345.6789, 'N0') AS 'عدد بدون اعشار',
FORMAT(12345.6789, 'N2') AS 'عدد با دو رقم اعشار',
FORMAT(0.1234, 'P', 'en-US') AS 'درصد آمریکایی';
* ‘N0’ عدد را بدون اعشار و با جداکننده هزارگان نمایش میدهد.
* ‘N2’ عدد را با دو رقم اعشار و با جداکننده هزارگان نمایش میدهد.
* ‘P’ برای نمایش درصد استفاده میشود.
**قالببندی ارز و پول در SQL Server**
یکی از کاربردهای کلیدی تابع `FORMAT`، قالببندی مقادیر پولی است. با استفاده از کد ‘C’ (Currency) و تعیین پارامتر `culture`، میتوانید مبالغ را با نماد ارز مربوط به هر منطقه نمایش دهید.
نمونههایی از قالببندی پول با فرهنگهای مختلف:
SELECT FORMAT(12345.67, 'C', 'en-US') AS 'واحد پول آمریکایی (دلار)',
FORMAT(12345.67, 'C', 'fa-IR') AS 'واحد پول ایرانی (ریال)',
FORMAT(12345.67, 'C', 'de-DE') AS 'واحد پول آلمانی (یورو)';
این قابلیت برای ساخت گزارشهای مالی و سیستمهای پرداخت بینالمللی ضروری است.
**استفاده از فرمتهای سفارشی (Custom Formats)**
تابع `FORMAT` از الگوهای فرمتبندی سفارشی (custom format strings) نیز پشتیبانی میکند که بر اساس استانداردهای داتنت طراحی شدهاند. این به شما امکان میدهد تا کنترل دقیقتری بر نحوه نمایش دادهها داشته باشید.
مثالهایی از فرمتهای سفارشی برای تاریخ و زمان:
SELECT FORMAT(GETDATE(), 'dddd, dd MMMM yyyy HH:mm:ss') AS 'تاریخ و زمان سفارشی';
در این مثال:
* `dddd`: نام کامل روز (مثلاً “شنبه”)
* `dd`: روز ماه با دو رقم
* `MMMM`: نام کامل ماه (مثلاً “ژانویه”)
* `yyyy`: سال با چهار رقم
* `HH`: ساعت با فرمت 24 ساعته
* `mm`: دقیقه
* `ss`: ثانیه
مثالهایی از فرمتهای سفارشی برای اعداد:
SELECT FORMAT(12345.67, '#,##0.00') AS 'عدد سفارشی',
FORMAT(0.1234, '0.00%') AS 'درصد سفارشی';
* `#,##0.00`: عدد را با جداکننده هزارگان و دو رقم اعشار اجباری نمایش میدهد.
* `0.00%`: عدد را به صورت درصد با دو رقم اعشار اجباری نمایش میدهد.
**بررسی مقادیر NULL با تابع FORMAT**
هنگامی که مقدار ورودی به تابع `FORMAT`، `NULL` باشد، خروجی تابع نیز `NULL` خواهد بود. این رفتار برای حفظ سازگاری در مواجهه با دادههای ناموجود یا نامشخص مهم است.
مثال:
SELECT FORMAT(NULL, 'dd/MM/yyyy') AS 'خروجی Null';
**نکات عملکردی (Performance Considerations)**
با وجود قدرت و انعطافپذیری تابع `FORMAT`، لازم است به این نکته توجه شود که این تابع به عنوان یک تابع CLR (Common Language Runtime) پیادهسازی شده است. این بدان معناست که ممکن است در مقایسه با توابع بومی T-SQL مانند `CONVERT` یا `CAST`، در سناریوهای با حجم بالای داده، عملکرد کمی کندتر داشته باشد.
برای عملیاتهای حیاتی از نظر عملکرد که نیازی به قابلیتهای پیشرفته قالببندی `FORMAT` ندارند، استفاده از `CONVERT` یا `CAST` میتواند گزینه بهتری باشد. به عنوان مثال، برای تبدیل یک تاریخ به رشته “YYYY-MM-DD”، میتوانید از `CONVERT` به شکل زیر استفاده کنید:
SELECT GETDATE() AS 'تاریخ اصلی', CONVERT(VARCHAR(10), GETDATE(), 120) AS 'تبدیل با CONVERT';
انتخاب بین `FORMAT` و سایر توابع به نیازهای خاص شما از نظر قالببندی، خوانایی کد و ملاحظات عملکردی بستگی دارد. تابع `FORMAT` انتخابی عالی برای مواقعی است که نیاز به قالببندی پیچیده و محلیسازی (localization) دارید.