PDA

View Full Version : تبدیل تاریخ میلادی به شمسی با دستور Format



mohammad diba
چهارشنبه 15 آذر 1402, 11:32 صبح
سلام بر دوستان عزیز و خوبم
ظاهرا برای تبدیل تاریخ میلادی به شمسی می توان از دستور Format استفاده کرد مطابق زیز

<code>
DECLARE @today DATE = GETDATE();
SELECT FORMAT( @today, 'yyyy-MM-dd', 'fa-IR' ) -- ۱۴۰۰-۰۱-۰۵
SELECT FORMAT( @today, 'yyyy-MMM', 'fa-IR' ) --۱۴۰۰-فروردین
SELECT FORMAT( @today, 'yyyy-MM-dd-dddd', 'fa-IR' ) --۱۴۰۰-۰۱-۰۵-پنجشنبه

<code/>
ولی برای من عمل نکرد و همون تاریخ میلادی رو داد مشکل کجاست؟

mazoolagh
چهارشنبه 15 آذر 1402, 13:03 عصر
سلام و روز خوش

تاریخ رو تبدیل نمیکنه، فقط در نمایش کاربرد داره.
DECLARE @today DATE = GETDATE();
SELECT FORMAT( @today, 'yyyy-MM-dd', 'fa-IR' )
SELECT FORMAT( @today, 'yyyy-MMM', 'fa-IR' )
SELECT FORMAT( @today, 'yyyy-MM-dd-dddd', 'fa-IR' )

ولی میتونین در یک فیلد دیگه به صورت varchar یا int ذخیره کنین.

mohammad diba
چهارشنبه 15 آذر 1402, 14:39 عصر
سلام و روز خوش

تاریخ رو تبدیل نمیکنه، فقط در نمایش کاربرد داره.
DECLARE @today DATE = GETDATE();
SELECT FORMAT( @today, 'yyyy-MM-dd', 'fa-IR' )
SELECT FORMAT( @today, 'yyyy-MMM', 'fa-IR' )
SELECT FORMAT( @today, 'yyyy-MM-dd-dddd', 'fa-IR' )

ولی میتونین در یک فیلد دیگه به صورت varchar یا int ذخیره کنین.

ممنون از پاسخ شما
یعنی این پست غلطه؟
https://dba.stackexchange.com/questions/283911/how-do-convert-gregorian-date-to-persian-date-in-sql-server

mazoolagh
چهارشنبه 15 آذر 1402, 18:42 عصر
100% اشتباه هست،
خروجی تابع FORMAT از نوع متن هست (nvarchar) و نه تاریخ (date).

این تابع صرفا تاریخ رو بر اساس culture که بهش میدین به شکل متن برمیگردونه.

برای اطمینان میتونین کدهای زیر رو اجرا و نتیجه رو ببینین:
SELECT GETDATE() AS [Data Value],
SQL_VARIANT_PROPERTY(GETDATE() , 'BaseType') AS [Data Type]

SELECT FORMAT(GETDATE() , 'yyyy-MM-dd' , 'fa-IR') AS [Data Value],
SQL_VARIANT_PROPERTY(FORMAT(GETDATE() , 'yyyy-MM-dd', 'fa-IR') , 'BaseType') AS [Data Type]

155101

155102

mohammad diba
پنج شنبه 16 آذر 1402, 13:46 عصر
100% اشتباه هست،
خروجی تابع FORMAT از نوع متن هست (nvarchar) و نه تاریخ (date).

این تابع صرفا تاریخ رو بر اساس culture که بهش میدین به شکل متن برمیگردونه.

برای اطمینان میتونین کدهای زیر رو اجرا و نتیجه رو ببینین:
SELECT GETDATE() AS [Data Value],
SQL_VARIANT_PROPERTY(GETDATE() , 'BaseType') AS [Data Type]

SELECT FORMAT(GETDATE() , 'yyyy-MM-dd' , 'fa-IR') AS [Data Value],
SQL_VARIANT_PROPERTY(FORMAT(GETDATE() , 'yyyy-MM-dd', 'fa-IR') , 'BaseType') AS [Data Type]

155101

155102

خیلی ممنون از شما و تشکر ویژه که خالصانه آموزش میدید
ولی مشکل من اینه که همون شمسی هم نشون نمیده مشکل کجاست؟
155105

mazoolagh
شنبه 18 آذر 1402, 09:26 صبح
چون تابع FORMAT از امکانات dot net استفاده میکنه و برای فرمت لازم نیست که اون زبان روی سیستم نصب باشه؛
پس این که ریشه مشکل در نصب زبان فارسی باشه منتفی هست:
DECLARE @Date date=GETDATE();

SELECT N'ایران' AS Culture, FORMAT(@Date , 'D' , 'fa') AS [Date] UNION
SELECT N'عربستان' AS Culture, FORMAT(@Date , 'D' , 'ar-sa') AS [Date] UNION
SELECT N'انگلیس' AS Culture, FORMAT(@Date , 'D' , 'en-gb') AS [Date] UNION
SELECT N'آمریکا' AS Culture, FORMAT(@Date , 'D' , 'en-us') AS [Date] UNION
SELECT N'فرانسه' AS Culture, FORMAT(@Date , 'D' , 'fr') AS [Date] UNION
SELECT N'آلمان' AS Culture, FORMAT(@Date , 'D' , 'de') AS [Date]UNION
SELECT N'چین' AS Culture, FORMAT(@Date , 'D' , 'zh') AS [Date]

155117

شاید ورژن MS SQL شما خیلی پایین هست،
تست کنین:
PRINT @@VERSION

mohammad diba
سه شنبه 21 آذر 1402, 09:53 صبح
چون تابع FORMAT از امکانات dot net استفاده میکنه و برای فرمت لازم نیست که اون زبان روی سیستم نصب باشه؛
پس این که ریشه مشکل در نصب زبان فارسی باشه منتفی هست:
DECLARE @Date date=GETDATE();

SELECT N'ایران' AS Culture, FORMAT(@Date , 'D' , 'fa') AS [Date] UNION
SELECT N'عربستان' AS Culture, FORMAT(@Date , 'D' , 'ar-sa') AS [Date] UNION
SELECT N'انگلیس' AS Culture, FORMAT(@Date , 'D' , 'en-gb') AS [Date] UNION
SELECT N'آمریکا' AS Culture, FORMAT(@Date , 'D' , 'en-us') AS [Date] UNION
SELECT N'فرانسه' AS Culture, FORMAT(@Date , 'D' , 'fr') AS [Date] UNION
SELECT N'آلمان' AS Culture, FORMAT(@Date , 'D' , 'de') AS [Date]UNION
SELECT N'چین' AS Culture, FORMAT(@Date , 'D' , 'zh') AS [Date]

155117

شاید ورژن MS SQL شما خیلی پایین هست،
تست کنین:
PRINT @@VERSION

سلاممجدد و تشکر بسیار زیاد از راهنمایی ارزشمند شما
نگارش 2017 است
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64)
Aug 22 2017 17:04:49
Copyright (C) 2017 Microsoft Corporation
Enterprise Edition (64-bit) on Windows 8.1 Pro 6.3 <X64> (Build 9600: )

mazoolagh
سه شنبه 21 آذر 1402, 19:37 عصر
سلام دوباره و روز شما خوش

پس مشکل ورژن هم نیست (و البته به احتمال قریب به یقین اگر ورژن سرور پایین بود کوئری اجرا نمیشد و خطا میداد).

چیزی که به ذهن من میرسه این هست که MSSQL SERVER شما به CLR RUNTIME دسترسی نداره.

بهتره اول مطمئن بشیم که ران تایم ها روی سیستم نصب هستن و درست کار میکنن:

[system.environment]::version

[system.threading.thread]::currentthread.currentculture = "fa"; get-date
155133
اگر نتیجه مثل این تصویر بالا بود مشکلی در CLR RUNTIME نیست،
اگر نوشته ها فارسی نیست از تنظیمات خود پاورشل فونت COURIER NEW رو انتخاب کنین،
یا این که یک کالچر دیگه مثلا آلمان (de) یا فرانسه (fr) رو تست کنین.

حالا clr رو روی MSSQL SERVER فعال کنین و نتیجه اش رو ببینین که آیا درست شده یا نه:
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

بررسی:
SELECT * FROM sys.configurations
WHERE name = 'clr enabled'

رفرنس: Enabling CLR Integration (https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration#enabling-clr-integration)

--------------
البته برای سیستم من clr enabled نیست!! و تابع Format هم کار میکنه.
ولی محض احتیاط شاید سیستم شما باید enable باشه حتما.

mohammad diba
چهارشنبه 22 آذر 1402, 08:21 صبح
سلام دوباره و روز شما خوش

پس مشکل ورژن هم نیست (و البته به احتمال قریب به یقین اگر ورژن سرور پایین بود کوئری اجرا نمیشد و خطا میداد).

چیزی که به ذهن من میرسه این هست که MSSQL SERVER شما به CLR RUNTIME دسترسی نداره.

بهتره اول مطمئن بشیم که ران تایم ها روی سیستم نصب هستن و درست کار میکنن:

[system.environment]::version

[system.threading.thread]::currentthread.currentculture = "fa"; get-date
155133
اگر نتیجه مثل این تصویر بالا بود مشکلی در CLR RUNTIME نیست،
اگر نوشته ها فارسی نیست از تنظیمات خود پاورشل فونت COURIER NEW رو انتخاب کنین،
یا این که یک کالچر دیگه مثلا آلمان (de) یا فرانسه (fr) رو تست کنین.

حالا clr رو روی MSSQL SERVER فعال کنین و نتیجه اش رو ببینین که آیا درست شده یا نه:
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO

بررسی:
SELECT * FROM sys.configurations
WHERE name = 'clr enabled'

رفرنس: Enabling CLR Integration (https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration#enabling-clr-integration)

--------------
البته برای سیستم من clr enabled نیست!! و تابع Format هم کار میکنه.
ولی محض احتیاط شاید سیستم شما باید enable باشه حتما.

سلام مجدد
فقط یک چیز میتونم بکم و اون هم تشکر خالصانه است
من تست کردم
clr هم اوکی نیست
یعنی جواب غلط داد
احتمال داره چون ویندوزم 8.1 است مشکل داشته باشه؟

mazoolagh
پنج شنبه 23 آذر 1402, 19:28 عصر
سلام دوباره
متاسفم که نتونستم ریشه مشکل رو تشخیص بدم و کمکی بکنم.


من تست کردم
clr هم اوکی نیست
یعنی جواب غلط داد
با توجه به تصویری که پیوست کردین نصب هست و درسته - پس مشکل از نصب sql server نیست.
الان بنظر میاد اسم روز و ماه و وقت روز رو فارسی آورده که به خاطر فونت درست دیده نمیشه.
برای اطمینان از این که اون اسامی فارسی شده متاثر از regional settings نیست،
با کالچر de هم تست کنین (حالا هر زبانی که مطمنا روی سیستم نصب نیست).



احتمال داره چون ویندوزم 8.1 است مشکل داشته باشه؟
بعید میدونم. اینجور چیزها باید روی همه ورژن های ویندوز کار کنه.

با این وجود من روی سیستم ویندوز 8.1 sql server نصب و تست میکنم و نتیجه رو همیجا میگم تا مطمئن بشین.

mazoolagh
شنبه 25 آذر 1402, 19:23 عصر
احتمال داره چون ویندوزم 8.1 است مشکل داشته باشه؟


روی سیستم ویندوز 8.1 sql server نصب و تست میکنم و نتیجه رو همیجا میگم

گویا همینجور بود که خودتون حدس زده بودین:
در ویندوز 8.1 فرمت تاریخ روی کالچر fa کار نمیکنه!
البته در برنامه ها چون از globalization.persiancalendar استفاده میکنیم متوجه این مورد نشده بودم.

نمیدونم با توجه به اینکه مدتی هست که دیگه 8.1 پشتیبانی نمیشه تا چه اندازه در آپگرید به ویندوز 10 یا 11 دستتون بازه.
اگر واقعا محدود به همین 8.1 هستین، میتونین خودتون تابع تبدیل بنویسین، همینجور که از قدیم هم مجبور به این کار بودن.
فکر کنم جستجو کنین تابع آماده پیدا میشه، ولی پیشنهاد میکنم این کار رو نکنین!
بیشتر این توابع مشکل محاسبه یا پرفورمنس یا هر دو رو دارن.

خیلی بهتر هست اگر در کدنویسی دستی دارین یک کتابخانه براساس همین persiancalendar با #C بنویسین و توابع خودتون رو بسازین،
بعد اون رو به sql server معرفی کنین تا این توابع رو بشناسه.

mohammad diba
یک شنبه 26 آذر 1402, 15:34 عصر
سلام دوست عزیز
خیلی خیلی ممنون از لطفتتون
بزرگانی مثل شما شایسته ستایش هستن
برقرار باشید و پایدار

H.Jafari
چهارشنبه 29 آذر 1402, 14:19 عصر
سلام بر دوستان عزیز و خوبم
ظاهرا برای تبدیل تاریخ میلادی به شمسی می توان از دستور Format استفاده کرد مطابق زیز

<code>
DECLARE @today DATE = GETDATE();
SELECT FORMAT( @today, 'yyyy-MM-dd', 'fa-IR' ) -- ۱۴۰۰-۰۱-۰۵
SELECT FORMAT( @today, 'yyyy-MMM', 'fa-IR' ) --۱۴۰۰-فروردین
SELECT FORMAT( @today, 'yyyy-MM-dd-dddd', 'fa-IR' ) --۱۴۰۰-۰۱-۰۵-پنجشنبه

<code/>
ولی برای من عمل نکرد و همون تاریخ میلادی رو داد مشکل کجاست؟

سلام از اين فانكشن استفاده كنيد ببينيد آيا جواب ميده
create or ALTER FUNCTION [dbo].[PersianDate]
(
@date DATETIME


)
RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @result VARCHAR(10)
SET @result =format(@date, 'yyyy/MM/dd', 'fa')


RETURN @Result


END

mazoolagh
پنج شنبه 30 آذر 1402, 08:32 صبح
از اين فانكشن استفاده كنيد ببينيد آيا جواب ميده
شما مشخصا هیچ پستی از این بحث رو نخوندین و مطلب رو نگرفتین که چی هست!