خانه > MSSQL Server > تبدیل تاریخ شمسی یا جلالی به میلادی و بالعکس در sql server

تبدیل تاریخ شمسی یا جلالی به میلادی و بالعکس در sql server

How to convert Persian Or Jalali Calendar to Gregorian Calendar & vice versa In Sql Server.

دو تابع بسیار مفید زیر برای تبدیل تاریخ شمسی یا جلالی به میلادی و بالعکس یعنی تبدیل تاریخ میلادی به شمسی در sql server می باشند.

تبدیل از میلادی به شمسی

برگرفته از اینترنت

یکی از دوستان زحمت کشیدن و اصلاح شده مورد فوق را برام فرستادند که عینا لینک سایتشون را قرار می دم

http://rastan.parsiblog.com/Posts/381

 

Categories: MSSQL Server Tags:
  1. کامی
    ۵ آذر ۱۳۹۲ در ۱۰:۵۹ | #1

    ممنون. خیلی عالی بود

  2. علی
    ۱۶ اردیبهشت ۱۳۹۳ در ۰۷:۳۹ | #3

    سلام. کد بسیار خوبی بود و جواب داد. از لطف شما سپاسگذارم.

  3. مراد
    ۲۹ اردیبهشت ۱۳۹۳ در ۰۶:۰۱ | #5

    ممنون.
    در تبدیل تاریخ شمسی به میلادی در محاسبه سال کبیسه دچار خطا شده و اشتباه محاسبه می کند

    • ۲۹ اردیبهشت ۱۳۹۳ در ۰۶:۰۹ | #6

      با سلام و ممنون از بازدیدتون
      لطفا اگر اصلاح کردید نسخه ای از آن را برای ما بفرستید تا با نام خودتان درج کنیم تا بقیه بتوانند استفاده کنند

  4. عبداله عابری
    ۱۷ مهر ۱۳۹۳ در ۰۶:۱۱ | #7

    سلام با تشکر
    واقعا از مطالب مفیدتون استفاده کردم به امید موفق بیشترتون

  5. vaid
    ۲۴ مهر ۱۳۹۳ در ۱۸:۵۵ | #9

    باسلام
    چطوری میتونم این تابع روی جدولی که یک فیلد تاریخ شمسی دارد اجرا کنم و خروجی بگیرم؟
    لطفا راهنمایی کنید

    • ۳ آبان ۱۳۹۳ در ۱۳:۳۹ | #10

      با سلام
      ضمن تشکر از بازدیدتون و عذر تاخیر برای استفاده یک مثال در انتهای کدهای ارائه شده وجود دارد که امیدوارم براتون قابل استفاده باشد

      با تشکر
      فعال خواه

  6. جعفر
    ۲۵ مهر ۱۳۹۳ در ۱۶:۳۴ | #11

    سلام
    با تشکر
    این تابع باید برای جدولم تعریفش کنم ؟

  7. حسین
    ۱ آذر ۱۳۹۳ در ۱۲:۴۲ | #13

    با تشکر

    متاسفانه یک روز تاریخ شمسی یک روز جلوتر محاسبه می کند

  8. حسین
    ۴ آذر ۱۳۹۳ در ۱۰:۳۹ | #14

    با سلام

    متاسفانه سالهای کبیسه رو درست محاسبه نمی کند

    • ۱۱ آذر ۱۳۹۳ در ۰۷:۱۵ | #15

      با سلام
      ضمن تشکر از توجه شما، در صورتیکه راه حلی برای آن دارید و یا اصلاحش کرده اید لطفا بفرستید تا با ایمیل و نام خودتان آنرا برای استفاده دیگران منتشر کنیم.

  9. معراج
    ۲۶ آذر ۱۳۹۳ در ۰۷:۰۵ | #16

    باتشکر
    این توابع ۶تا۳۱و۵تا۳۰ و ۱تا۲۹ روزمحاسبه می کند اما من می خواهم ۱۲ تا ۳۰ روز حساب کند.باید چطور اصلاحش کنم؟؟؟؟؟؟؟؟؟؟

  10. روح اله
    ۲۹ آذر ۱۳۹۳ در ۱۳:۱۷ | #17

    به نظرم تابع زیر مختصرتر و کارآمدتر است
    CREATE FUNCTION [dbo].[GregorindDate2Jalali] ( @intDate DATETIME )
    RETURNS NCHAR(10)
    AS
    BEGIN

    DECLARE @shYear AS INT ,
    @shMonth AS INT ,
    @shDay AS INT ,
    @intYY AS INT ,
    @intMM AS INT ,
    @intDD AS INT ,
    @Kabiseh1 AS INT ,
    @Kabiseh2 AS INT ,
    @d1 AS INT ,
    @m1 AS INT

    DECLARE @DayDate AS NCHAR(10)

    SET @intYY = DATEPART(yyyy, @intDate)
    IF ( @intYY < 1000 )
    SET @intYY = @intYY + 2000
    SET @intMM = MONTH(@intDate)
    SET @intDD = DAY(@intDate)
    SET @shYear = @intYY – 622

    IF ( ( @intYY – 1992 ) % 4 ) 0
    SET @Kabiseh1 = 0
    ELSE
    SET @Kabiseh1 = 1

    IF ( ( @shYear – 1371 ) % 4 ) 0
    SET @Kabiseh2 = 0
    ELSE
    SET @Kabiseh2 = 1

    SET @m1 = 1
    SET @d1 = 1
    SET @shMonth = 10
    SET @shDay = 11

    IF ( ( @intYY – 1993 ) % 4 = 0 )
    SET @shDay = 12

    WHILE ( @m1 != @intMM )
    OR ( @d1 != @intDD )
    BEGIN

    SET @d1 = @d1 + 1
    IF ( @d1 = 32 )
    AND ( @m1 = 1 )
    BEGIN
    SET @m1 = 2
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 29 )
    AND ( @m1 = 2 )
    AND ( @Kabiseh1 = 0 )
    BEGIN
    SET @m1 = 3
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 30 )
    AND ( @m1 = 2 )
    BEGIN
    SET @m1 = 3
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 32 )
    AND ( @m1 = 3 )
    BEGIN
    SET @m1 = 4
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 31 )
    AND ( @m1 = 4 )
    BEGIN
    SET @m1 = 5
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 32 )
    AND ( @m1 = 5 )
    BEGIN
    SET @m1 = 6
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 31 )
    AND ( @m1 = 6 )
    BEGIN
    SET @m1 = 7
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 32 )
    AND ( @m1 = 7 )
    BEGIN
    SET @m1 = 8
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 32 )
    AND ( @m1 = 8 )
    BEGIN
    SET @m1 = 9
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 31 )
    AND ( @m1 = 9 )
    BEGIN
    SET @m1 = 10
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 32 )
    AND ( @m1 = 10 )
    BEGIN
    SET @m1 = 11
    SET @d1 = 1
    END

    ELSE
    IF ( @d1 = 31 )
    AND ( @m1 = 11 )
    BEGIN
    SET @m1 = 12
    SET @d1 = 1
    END

    SET @shDay = @shDay + 1

    IF ( @shDay = 32 )
    AND ( @shMonth 6 )
    AND ( @shMonth < 12 )
    BEGIN
    SET @shMonth = @shMonth + 1
    SET @shDay = 1
    END

    ELSE
    IF ( @shDay = 30 )
    AND ( @shMonth = 12 )
    AND ( @Kabiseh2 = 0 )
    BEGIN
    SET @shMonth = 1
    SET @shDay = 1
    SET @shYear = @shYear + 1
    END

    ELSE
    IF ( @shDay = 31 )
    AND ( @shMonth = 12 )
    BEGIN
    SET @shMonth = 1
    SET @shDay = 1
    SET @shYear = @shYear + 1
    END

    END — while

    SET @DayDate = REPLACE(RIGHT(STR(@shYear, 4), 4), ' ', '0') + '/'
    + REPLACE(STR(@shMonth, 2), ' ', '0') + '/' + REPLACE(( STR(@shDay,
    2) ), ' ', '0')

    RETURN @DayDate
    END

  11. ۷ دی ۱۳۹۳ در ۰۹:۱۰ | #18

    با تشکر از شما دوست گرامی که زحمت این تابع را کشیدید.
    اگر سایر عزیزان در این خصوص نظری داشته باشند بفرمایند.

  12. رسول
    ۳۱ فروردین ۱۳۹۴ در ۱۱:۱۲ | #19

    ممنون از شما

  13. ۴ تیر ۱۳۹۴ در ۰۵:۴۸ | #21

    @روح اله

    کد ارائه شده در پست اصلی یک روز خطا داشت و خروجی اشتباه می‌داد.

    اما کد موجود در کامنت آقا روح اله بسیار ساده و روشن بود. ولی ایراداتی داشت که اصلاح نمودم و در نشانی http://rastan.parsiblog.com/Posts/381 قرار دادم که به خوبی هم کار می‌کند.

    موفق باشید

  14. ۶ تیر ۱۳۹۴ در ۰۶:۳۴ | #23

    سلام و ممنون از پست مفید شما.
    به نظر اگر فرمت عددی برای هماهنگی اعداد تاریخ تبدیل شده اضافه شود بهتر باشد. مانند زیر:
    خط آخر تابع [UDF_Gregorian_To_Persian]
    Return Convert(nvarchar(50),FORMAT(@iDay, ‘D2′)) + ‘-’ + Convert(nvarchar(50),Format(@iMonth, ‘D2′)) +’-’ + Convert(nvarchar(50),Format(@iYear, ‘D4′))

    تاریخ برگردانده شده از : ۳۰-۲-۱۳۹۴ به ۳۰-۰۲-۱۳۹۴ تغییر خواهد کرد مثلا

    • ۳۱ تیر ۱۳۹۴ در ۰۶:۲۶ | #24

      ضمن تشکر ممنون از پیشنهادتون. بقیه دوستان هم می تونند استفاده کنند و نظرشون را بگن تا بعد از اکی شدن تو سایت قرارش بدیم

  15. مریم
    ۳۱ تیر ۱۳۹۴ در ۰۶:۴۸ | #25

    با عرض سلام و وقت بخیر
    ممنون از سایت خوبتون
    تابع تبدیل میلادی به شمسی برای سال ۱۴۰۳ که سال کبیسه هست به بعد اشتباه است

    Select dbo.[UDF_Gregorian_To_Persian](’2025-3-20′) as [Persian Date]

  16. محمد مهدی
    ۱۴ مرداد ۱۳۹۴ در ۱۲:۲۴ | #27

    با سلام ، خیلی ممنون از پست مفید شما

  17. کبیسه
    ۱۵ شهریور ۱۳۹۴ در ۰۸:۱۷ | #28

    در تطبیق سال های کبیسه مثل همه مبدلهای دیگه دارای اشکال است.
    برای اطلاع بیشتر به لینک زیر مراجعه شود:
    https://fa.wikipedia.org/wiki/%DA%AF%D8%A7%D9%87%E2%80%8C%D8%B4%D9%85%D8%A7%D8%B1%DB%8C_%D8%AF%D8%B1_%D8%A7%DB%8C%D8%B1%D8%A7%D9%86

    • ۲۲ شهریور ۱۳۹۴ در ۰۵:۲۰ | #29

      ممنون از توجه دوست خوبمون و زحمتی که بابت لینک کشیدند. سایر دوستان اگر نظری دارند ممنون می شویم که ذکر کنند.

  18. ۲۰ مهر ۱۳۹۴ در ۲۲:۳۹ | #30

    با سلام در خروجی زمان هم نیاز دارم لطفا کمک کنید تشکر

  19. ugd
    ۱۵ آذر ۱۳۹۴ در ۰۶:۲۷ | #31

    کاش یه راهی بود که ماه ها رو با فانکشن توی اسکو ال اضافه کردد یه تابع اضافه ماه مث خود addDate

  20. ashkan
    ۱۶ اسفند ۱۳۹۴ در ۱۳:۴۰ | #32

    خسته نباشید، من تاریخ تبدیل شده از میلادی به شمسی رو ۱۰ رقمی میخوام. متاسفانه این تابع ۰۷-۱۲-۱۹۳۴ رو به ۷-۱۲-۱۳۹۴ تبدیل میکنه
    کسی میتونه کمک کنه؟

  21. جواد
    ۱۱ مهر ۱۳۹۵ در ۱۵:۴۱ | #33

    آفرین عالیه
    متشکرم
    موفق باشید

  22. یک دوست
    ۱۸ آبان ۱۳۹۵ در ۰۶:۵۱ | #34

    سلام
    ممنون از شما.
    تابع برای بعد از ظهرها باگ دارد مثلاً: در مورد ’۲۰۱۶-۱۱-۰۸ ۱۲:۰۱:۴۱٫۷۶۰′ یک روز بعد را نمایش می دهد که با قرار دادن عبارت زیر در اول تابع اصلاح می گردد
    SET @date = CONVERT(DATE, @date)
    همچنین خروجی تابع وارونه هست و شماره ماه و روزهای تک رقمی را بدون صفر سمت چپ نشان می دهد که اگر بخواهمی اصلاح کنیم، آخر تابع به قرار زیر تغییر می کند

    DECLARE @DayStr nvarchar(2) = RIGHT (’00′+ LTRIM(STR(@iDay, 2, 2)), 2)
    DECLARE @MonthStr nvarchar(2) = RIGHT (’00′+ LTRIM(STR(@iMonth, 2, 2)), 2)
    DECLARE @YearStr nvarchar(4) = RIGHT (’00′+ LTRIM(STR(@iYear, 4, 4)), 4)

    RETURN @YearStr + ‘-’ + @MonthStr + ‘-’ + @DayStr

    در ضمن آدرس ایمیل یک مقدار دلخواه هست و معتبر نیست

  23. یک دوست
    ۱۸ آبان ۱۳۹۵ در ۰۶:۵۵ | #35

    البته جدا از نکاتی که گفتم، تابع بسیار عالی هست. من خروجی تابع را با سایت time.ir چک کردم، از ۱۰۰ سال گذشته تا ۲۰۰ سال بعد را درست تبدیل می کند.
    بسیار ممنون

  24. یک دوست
    ۱۸ آبان ۱۳۹۵ در ۰۷:۰۲ | #36

    با عرض پوزش،
    در اواخر تابع یک اشتباه مرتکب شدم که به قرار زیر اصلاح می گردد

    DECLARE @YearStr nvarchar(4) = STR(@iYear, 4, 4)

  25. حمید
    ۱۵ آذر ۱۳۹۵ در ۱۰:۱۷ | #38

    یه سوال چرا وقتی تاریخ مثلا ۵۷/۱۲/۱۳۹۵ رو به میلادی تبدیل میکنی تبدیل میشه و خطا نمیخوره؟!!!

  1. بدون بازتاب
برای فرستادن دیدگاه بایدوارد شوید.
IP Blocking Protection is enabled by IP Address Blocker from LionScripts.com.