PDA

View Full Version : سوال: تبديل تاريخ ميلادي به هجري شمسي به T-SQL



m_omrani
سه شنبه 19 مرداد 1389, 12:05 عصر
سلام.از دوستان کسی UDF يا SP به زبان T-SQL (دقت کنيد، دقيقاً T-SQL نه SQLCLR) براي تبديل تاريخ ميلادي به هجري شمسي سراغ دارد؟
من در تالار فعلي (SQL Server) هم با کلمه کليدي "هجري شمسي" جستجو کردم اما چيزي پيدا نکردم.

Iran58
پنج شنبه 21 مرداد 1389, 11:47 صبح
سلام
به لينك زير رجوع كنيد
http://barnamenevis.org/forum/showthread.php?t=220772

meysam_pro
پنج شنبه 21 مرداد 1389, 19:28 عصر
CREATE FUNCTION [dbo].[MiladiTOShamsi] (@MDate DateTime)
RETURNS Varchar(10)
AS
BEGIN
DECLARE @SYear as Integer
DECLARE @SMonth as Integer
DECLARE @SDay as Integer
DECLARE @AllDays as float
DECLARE @ShiftDays as float
DECLARE @OneYear as float
DECLARE @LeftDays as float
DECLARE @YearDay as Integer
DECLARE @Farsi_Date as Varchar(100)
SET @MDate=@MDate-CONVERT(char,@MDate,114)

SET @ShiftDays=466699 +2
SET @OneYear= 365.24199


SET @SYear = 0
SET @SMonth = 0
SET @SDay = 0
SET @AllDays = CAst(@Mdate as Real)

SET @AllDays = @AllDays + @ShiftDays

SET @SYear = (@AllDays / @OneYear) --trunc
SET @LeftDays = @AllDays - @SYear * @OneYear

if (@LeftDays < 0.5)
begin
SET @SYear=@SYear+1
SET @LeftDays = @AllDays - @SYear * @OneYear
end;

SET @YearDay = @LeftDays --trunc
if (@LeftDays - @YearDay) >= 0.5
SET @YearDay=@YearDay+1

if ((@YearDay / 31) > 6 )
begin
SET @SMonth = 6
SET @YearDay=@YearDay-(6 * 31)
SET @SMonth= @SMonth+( @YearDay / 30)
if (@YearDay % 30) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 7) * 30)
end
else
begin
SET @SMonth = @YearDay / 31
if (@YearDay % 31) <> 0
SET @SMonth=@SMonth+1
SET @YearDay=@YearDay-((@SMonth - 1) * 31)
end
SET @SDay = @YearDay
SET @SYear=@SYear+1

SET @Farsi_Date = CAST (@SYear as VarChar(10)) + '/' + CAST (@SMonth as VarChar(10)) + '/' + CAST (@SDay as VarChar(10))
Return @Farsi_Date




چند سال پیش ، یکی از دوستان در همین تالار گذاشته بودن.

m_omrani
شنبه 23 مرداد 1389, 16:43 عصر
مرسي. الگوريتم را استفاده کردم. اما در محاسبه سال کبيسه باگ داره. به عنوان نمونه روز 20 مارس را براي سال هاي 2009 و 2010 چک کنيد.

voodoo01
شنبه 23 مرداد 1389, 17:10 عصر
با سلام دوست عزیز
اینجا فکر میکنم جوابتو پیدا کنی
http://www.barnamenevis.org/forum/showthread.php?t=232305


با آرزوی موفقیت
Voodoo01

m_omrani
دوشنبه 25 مرداد 1389, 02:20 صبح
متاسفانه اين الگوريتم هم ايراد داره، به طوري که از سال 1993 به ماقبل تمامي تاريخ ها رو با 1 روز کم و زياد بر مي گردونه. براي بررسي صحت اين مطلب مي تونيد از صفحه تبديل تاريخ موجود در آدرس http://calendar.ut.ac.ir/Fa/Software/CalConv.asp که وابسته به موسسه ژئوفيزيک دانشگاه تهرانه و تقويم کشور رو هر سال تدوين مي کنه استفاده کنيد.

باز هم ممنونم.

من از دو روز پيش خودم اقدام به نوشتن اين الگوريتم کردم. در واقع يک بار برنامه اي رو به زبان VB 6.0 که تبديل تاريخ رو با دقت زياد و به درستي انجام مي داد از اينترنت در سايت فردي به نام مهدي وجودي (http://www.vojoudi.com)پيدا کرده بودم. بعد از اين جريان رفتم سراغ سورس اون برنامه و تمامي کُدها رو از VB 6.0 به T-SQL تبديل کردم. اسکريپت نهايي رو هم به زودي در سايت مي ذارم.

با آرزوي موفقيت.