با کمی جستجو در اینترنت مشاهده خواهید کرد که توابع زیادی برای تبدیل تاریخ وجود دارد اما برخی از آنها یا کامل نیستند و یا اشکالاتی دارند. در این پست توابع تبدیل تاریخ شمسی به میلادی، میلادی به شمسی و میلادی به قمری را در کنار هم قرار دادهام. در نهایت نیز یک تابع جهت بدست آوردن سن افراد از تاریخ تولدشان معرفی شده است. این توابع برای تبدیل در بعضی تاریخ ها مشکلاتی داشتند که با یادآوری خوانندگان بلاگ رفع شد.
لازم به ذکر است که تابع تبدیل تاریخ میلادی به شمسی توسط آقای رضا راد نوشته شده است.
توابع تبدیل تاریخ میلادی به شمسی و شمسی به میلادی را از اینجا دریافت کنید.
پس از دانلود و اجرای کوئری ها، از طریق دستورات زیر میتوانید تبدیل تارخ میلادی به شمسی و شمسی به میلادی را انجام دهید.
از کوئری زیر برای مشاهده نتیجه استفاده کنید.
select dbo.GregorianToPersian('1980/01/01')
select dbo.ShamsitoMiladi('1358/10/11')
تبدیل تاریخ میلادی به قمری
از دستور زیر برای تبدلی تاریخ میلادی به قمری استفاده کنید.
SELECT CONVERT (nvarchar(30),GETDATE(),130) as Date
برای بدست آوردن سن از دستور زیر استفاده کنید.
SELECT DateDiff(yy , (select dbo.ShamsitoMiladi ('1365/01/01') ), GetDate())
با سلام
سوالی از خدمتتون داشتم
با توجه به اینکه استفاده از این توابع ممکن هست سربار زیادی در رکوردهای زیاد بوجود آورد. بهتر نیست یک فیلد اضافه در نظر گرفته شود و دو تاریخ شمسی و میلادی در رکورد ثبت شوند. فکر نمی کنم با توجه به سربار زیاد استفاده از توابع در رکوردهای زیاد استفاده از این روش نا مناسب باشد
با تشکر
سلام
صد درصد استفاده از یک فیلد اضافی برای تاریخ میلادی بهینه است اما از آنجایی که نمیتوانیم در ساختار جداول یک سازمان ماننده ساختار جدول پرسنلی تغیراتی ایجاد کنیم، گاهی مجبور به استفاده از این توابع هستیم.
Akhe adam code error dar mizare ro site!!!!
Khob nemizashti,Omadi masalan kasi copy nakone, baad bug andakhti
Khob nemikardi koln
دوست عزیز! کدها هیچ مشکلی ندارند و اگر با دقت کپی کنید حتما اجرا میشود.
با سلام - تبدیل شمسی به میلادی خطا داره، لطفا بررسی کنید و صحیح شو بذارید. روی SET @TMPRESULT=Cast(@MMonth as varchar(2))+'/'+CAST(@DDay Varchar(2))+'/'+CAST(@YYear as varchar(4)) - خطا میگیره. لطفا درستشو بذارید -ممنوووووننن
اسکریپت اصلاح شد!
Procedure 'NumberOfDaysInMonthGregorian' not found
این پروسیجر رو هم بگذارید تا خطا نده
با سلام
Function مورد نظر اضافه شد.
SET @Date = '2014-12-22'
تابع میلادی به شمسی تو این تاریخ به جای 1 دی ماه
11- دی ماه میده
ده روز اختلاف داره
و این مشکل تا 30 ماه 12 میلادی ادامه داره
بله این مشکل وجود داره و به زودی رفع میشود.
سلام. من خیلی تازه کار هستم. میشه لطفا بفرمایید اگر ما در جدول دو ستون داشته باشیم که اولی شامل تاریخ میلادی بصورت yyyy/mm/dd باشد و دومی بایستی به معادل شمسی این تاریخ و با همین فرمت تبدیل شود؛ دقیقاً باید چه دستوری توی Update Table بنویسم.
ممنون از شما
سلام
برای اینکار باید از کرسر استفاده کنید. کرسر زیر را در sql کپی و بر اساس نام جدول خود ویرایش کنید.
declare @Date_Shamsi varchar(10)
declare @Date_miladi date
declare Map cursor
for select Date_Miladi FROM [StageArea].[dbo].[Table_1]
open Map
fetch Map into @Date_miladi
while (@@FETCH_STATUS = 0)
begin
set @Date_Shamsi=(select dbo.GregorianToPersian(@Date_miladi))
update [dbo].[Table_1]
set Date_Shamsi=@Date_Shamsi
where Date_Miladi=@Date_miladi
fetch Map into @Date_miladi
end
close Map
deallocate Map
واسه mysql کار نکرد .
<a href="http://irankhodros.com" >!</>
سلام.
این function باگ داره. برای تاریخ '2017-12-21' مقدار 1396-09-30 رو برمیگردونه که درسته ولی برای روز بعدش '2017-12-22' مقدار 1396-10-12 رو برمیگردونه.
لطفا چک کنید.
با سلام
بنده از سایت هوش تجاری پژوهشیار به آدرس http://researchyar.ir مطالب شما رو هر از گاهی مطالعه می کنم و تبریک می گم بخاطر مطالب خوبتون.
با عرض سلام و خسته نباشی.
مقدار متغیر @StartDayGregorianDateInPersianCalendar بجای 12 و 11 باید 22 و 21 باشه وگرنه برای تاریخ های 22 ماه 12 میلادی تا 30 ماه 12 میلادی خطا دار میشه. البته بسته به اینکه سال کبیسه باشه یا نه میتونه برای تاریخ های 21 ماه 12 میلادی تا 30 ماه 12 میلادی خطادار باشه.
با تشکر.
سلام.
به اشتباه گفته بودم که برای درست شدن تاریخ از 22 ماه 12 تا آخرش باید مقدار @StartDayGregorianDateInPersianCalendar از 11 و 12 به 21 و 22 تغییر بدین.
احتیاج نیست به اونها دست بزنید و شرمنده از اینکه لدون دقت این رو گفتم.
تنها یه تغییر کوچیک لازمه بدین تا این قضیه درست بشه اونهم اینه که توی فانکشن GregorianToPersian
این خط رو
if(@m=@StartMonthGregorianDateInPersianCalendar)
به این خط تغییر بدین
if(@m=@StartMonthGregorianDateInPersianCalendar) and @Month=1
با تشکر و معذرت از اشتباه قبلی
بررسی میکنم
ممنون از دقت و توجه شما
مشکل داره کد : مثلا 2017/12/26 رو نشون میده 1396/10/16 !!!! در حالیکه 1396/10/5 باید باشه
اصلاح شد.
ممنون که اطلاع دادید
سپاس