صفحه 2 از 2 اولاول 12
نمایش نتایج 41 تا 63 از 63

نام تاپیک: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

  1. #41
    کاربر دائمی
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    1,629
    سلام
    من هنوز از Vista یا SQLServer 2005 استفاده نکردم، اما شنیده بودم که تاریخ جلالى (همون هجرى شمسى) رو هم پشتیبانى مى‌کنن. آیا این طور نیست؟

    در مورد توابع تبدیل تاریخ هم من دو تابع براى تبدیل شمسى به میلادى و برعکس دارم که فکر مى‌کنم از تمام توابع موجود سریع‌تر و کوتاه‌تر باشه البته محدود هست به smalldatetime.
    اگر به دردتون مى‌خوره بفرستم اینجا.

    صبا صبوحى

    پ.ن: این تابع در تمام دامنه تعریف تست شده و هیچ اشکالى ندارد.

  2. #42
    vista رو نمی دونم اما sql2005هنوز کامل پشتیبانی نمی کنه اما فکر کنم قرار توی آینده ای نزدیک این کار رو بکنه اصلا حقیقتش من واسه همین هم نرفتم سراغ 2005 گفتم هر موقع برادری شو ثابت کرد بعد می رم و هم اینکه این پایگاه داده عمومی تر بشه بعد می رم.

    اگه توابع تون رو بذارید ممنون می شم

  3. #43
    دوستان راه استفاده از این فانکشن ها رو میشه در حد مبتدی توضیح بدید البته من یکسری تابع پیدا کردم ببینید چطوره اون فانکشن تو آدرسه زیره:
    http://www.sayan.ir/PrintableArticle.aspx?ArticleID=195

  4. #44
    کاربر دائمی آواتار reza6384
    تاریخ عضویت
    آبان 1386
    محل زندگی
    تهران - شهرک ژاندارمری
    سن
    40
    پست
    740

    این هم برای SQL Server2000

    سلام. ضمن تشکر بسیار فراوون از دوست عزیزمون H_BAQERY که واقعا Solution اش خوشحالم کرد، عالی بود، نمی دونم چرا تاحالا به فکرم نرسیده بود.

    من هم برای ادامه تشکر یه دیتابیس توی SqlServer2000 به اسم PersianDates ساختم و توی جدول ALL_DATE از سال 1998 تا سال 2018 رو ذخیره کردم. یه توضیح هم بدم و اون اینکه با دو حالت Right to left , left to right رشته تاریخ فارسی رو ذخیره کردم. چون مثلا ممکنه تو CrystalReport ها اینوری بشه و توی Datagridview اون وری !

    در هر صورت خیلی Solution باحالی بود جناب H_BAQERY ، دمت گرم.

    فایل دیتابیس رو هم ضمیمه کردم.
    فایل های ضمیمه فایل های ضمیمه
    • نوع فایل: zip DB.zip‏ (271.1 کیلوبایت, 247 دیدار)

  5. #45
    نقل قول نوشته شده توسط Kamyar.Kimiyabeigi مشاهده تاپیک
    میلادی به شمسی

    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



    END


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

    CREATE FUNCTION [dbo].[ShamsiToMiladi](@DateStr varchar(10))
    RETURNS DATETIME
    AS
    BEGIN
    declare @YYear int
    declare @MMonth int
    declare @DDay int
    declare @epbase int
    declare @epyear int
    declare @mdays int
    declare @persian_jdn int
    declare @i int
    declare @j int
    declare @l int
    declare @n int
    declare @TMPRESULT varchar(10)
    declare @IsValideDate int
    declare @TempStr varchar(20)
    DECLARE @TmpDateStr varchar(10)

    SET @i=charindex('/',@DateStr)

    IF LEN(@DateStr) - CHARINDEX('/', @DateStr,CHARINDEX('/', @DateStr,1)+1) = 4
    BEGIN
    SET @TmpDateStr = dbo.ReversDate(@DateStr)
    IF ( ISDATE(@TmpDateStr) =1 )
    RETURN @TmpDateStr
    ELSE
    RETURN NULL
    END
    ELSE
    SET @TmpDateStr = @DateStr

    IF ((@i<>0) and
    (dbo.SubStrCount('/', @TmpDateStr)=2) and
    (ISNUMERIC(REPLACE(@TmpDateStr,'/',''))=1) and
    (charindex('.',@TmpDateStr)=0)
    )
    BEGIN
    SET @YYear=CAST(SUBSTRING(@TmpDateStr,1,@i-1) AS INT)
    IF ( @YYear< 1300 )
    SET @YYear =@YYear + 1300
    IF @YYear > 9999
    RETURN NULL

    SET @TempStr= SUBSTRING(@TmpDateStr,@i+1,Len(@TmpDateStr))

    SET @i=charindex('/',@TempStr)
    SET @MMonth=CAST(SUBSTRING(@TempStr,1,@i-1) AS INT)
    SET @MMonth=@MMonth-- -1

    SET @TempStr= SUBSTRING(@TempStr,@i+1,Len(@TempStr))

    SET @DDay=CAST(@TempStr AS INT)
    SET @DDay=@DDay-- - 1

    IF ( @YYear >= 0 )
    SET @epbase = @YYear - 474
    Else
    SET @epbase = @YYear - 473
    SET @epyear = 474 + (@epbase % 2820)

    IF (@MMonth <= 7 )
    SET @mdays = ((@MMonth) - 1) * 31
    Else
    SET @mdays = ((@MMonth) - 1) * 30 + 6

    SET @persian_jdn =(@DDay) + @mdays + CAST((((@epyear * 682) - 110) / 2816) as int) + (@epyear - 1) * 365 + CAST((@epbase / 2820) as int ) * 1029983 + (1948321 - 1)



    IF (@persian_jdn > 2299160)
    BEGIN
    SET @l = @persian_jdn + 68569
    SET @n = CAST(((4 * @l) / 146097) as int)
    SET @l = @l - CAST(((146097 * @n + 3) / 4) as int)
    SET @i = CAST(((4000 * (@l + 1)) / 1461001) as int)
    SET @l = @l - CAST( ((1461 * @i) / 4) as int) + 31
    SET @j = CAST(((80 * @l) / 2447) as int)
    SET @DDay = @l - CAST( ((2447 * @j) / 80) as int)
    SET @l = CAST((@j / 11) as int)
    SET @MMonth = @j + 2 - 12 * @l
    SET @YYear = 100 * (@n - 49) + @i + @l
    END

    SET @TMPRESULT=Cast(@MMonth as varchar(2))+'/'+CAST(@DDay as Varchar(2))+'/'+CAST(@YYear as varchar(4))
    RETURN Cast(@TMPRESULT as Datetime)

    END
    RETURN NULL

    END

    سورس dbo.ReversDate
    و dbo.SubStrCount را نگذاشتید

  6. #46
    کاربر دائمی آواتار Kamyar.Kimiyabeigi
    تاریخ عضویت
    خرداد 1384
    محل زندگی
    تهران
    پست
    1,276

    CREATE FUNCTION dbo.ReversDate (@DateStr varchar(10))
    RETURNS varchar(10)

    AS

    BEGIN
    DECLARE @TempStr varchar(10)
    DECLARE @StartIndex int
    DECLARE @SubStrLen int
    DECLARE @i int

    SET @TempStr = ''
    SET @StartIndex = LEN(@DateStr) + 2
    SET @i = LEN(@DateStr)
    WHILE @i > 0
    BEGIN
    IF SUBSTRING(@DateStr,@i,1) IN ('/', '-')
    BEGIN
    SET @SubStrLen = @StartIndex - (@i + 2)
    SET @StartIndex = @i + 1
    SET @TempStr = @TempStr + SUBSTRING(@DateStr,@StartIndex,@SubStrLen) + SUBSTRING(@DateStr,@i,1)
    END
    SET @i = @i - 1
    END
    IF @TempStr <> ''
    BEGIN
    SET @SubStrLen = @StartIndex - 2
    SET @TempStr = @TempStr + SUBSTRING(@DateStr,1,@SubStrLen)
    END
    ELSE
    SET @TempStr = @DateStr
    RETURN @TempStr
    END





    CREATE FUNCTION SubStrCount(@SubStr varchar(8000), @MainText Text)
    RETURNS int
    AS
    BEGIN
    DECLARE @StrCount int
    DECLARE @StrPos int

    SET @StrCount = 0
    SET @StrPos = 0
    SET @StrPos = CHARINDEX( @SubStr, @MainText, @StrPos)

    WHILE @StrPos > 0
    BEGIN
    SET @StrCount = @StrCount + 1
    SET @StrPos = CHARINDEX( @SubStr, @MainText, @StrPos+1)
    END

    RETURN @StrCount
    END


  7. #47

    نقل قول: این هم برای SQL Server2000

    نقل قول نوشته شده توسط reza6384 مشاهده تاپیک
    سلام. ضمن تشکر بسیار فراوون از دوست عزیزمون H_BAQERY که واقعا Solution اش خوشحالم کرد، عالی بود، نمی دونم چرا تاحالا به فکرم نرسیده بود.

    من هم برای ادامه تشکر یه دیتابیس توی SqlServer2000 به اسم PersianDates ساختم و توی جدول ALL_DATE از سال 1998 تا سال 2018 رو ذخیره کردم. یه توضیح هم بدم و اون اینکه با دو حالت Right to left , left to right رشته تاریخ فارسی رو ذخیره کردم. چون مثلا ممکنه تو CrystalReport ها اینوری بشه و توی Datagridview اون وری !

    در هر صورت خیلی Solution باحالی بود جناب H_BAQERY ، دمت گرم.

    فایل دیتابیس رو هم ضمیمه کردم.
    اين روش را قبلا ما استفاده ميكرديم و افت سرعت شديدي داشتيم اما بعد از استفاده از فانكشنها دوست عزيزمان آقاي linux در مقايسه و در مقياس 100000 ركورد متوجه شديم كه زمان اجراي دستور كاهش پيدا كرد (حدود 2.5 برابر بهتر شد )
    در عين حال در همان زمان بنده جدول مقايسه ايي از توابع دوست عزيزمان آقاي Linux و جدول خودمان كه در دلفي برنامه آن نوشته شده بود در اورديم كه متوجه 130 اشتباه در جداول خودمان شديم .

  8. #48
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313

    نقل قول: این هم برای SQL Server2000

    نقل قول نوشته شده توسط JavanSoft مشاهده تاپیک
    اين روش را قبلا ما استفاده ميكرديم و افت سرعت شديدي داشتيم اما بعد از استفاده از فانكشنها دوست عزيزمان آقاي linux در مقايسه و در مقياس 100000 ركورد متوجه شديم كه زمان اجراي دستور كاهش پيدا كرد (حدود 2.5 برابر بهتر شد )
    در عين حال در همان زمان بنده جدول مقايسه ايي از توابع دوست عزيزمان آقاي Linux و جدول خودمان كه در دلفي برنامه آن نوشته شده بود در اورديم كه متوجه 130 اشتباه در جداول خودمان شديم .
    الان کلا در تبدیل تقویم ها بحث بر سر محاسبه سال کبیسه هست، قانون چون الگوریتم خاصی را معرفی نکرده هرکسی روشی را پیشنهاد می دهد که 2 روش خیلی استفاده می شود که این روشی که در این توابع استفاده شده از روشی که در توابع تبدیل تاریخ در دات نت شده فرق می کنه. به خاطر همین ممکن در سالها 1403 دچار مشکل بشید، کلا هم نمیشه گفت کدام روش درست هست یا نیست، تا موقعی که قانون یکی از این روشهای موجود را مبنا قرار نده همین مشکل هست.

  9. #49
    کاربر دائمی آواتار Arghavan_Reza
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    171

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    با سلام به دوستان،
    دو تابع زیر را جهت تبدیل تاریخ میلادی به شمسی و بالعکس نوشته ام. می توانید امتحان کنید:
    1 - تبدیل تاریخ میلادی به شمسی:

    CREATE FUNCTION DateFarsi(@DateLatin AS DateTime)
    RETURNS CHAR(10) AS
    BEGIN
    DECLARE @DateFarsi CHAR(10)

    DECLARE @Days int
    DECLARE @Tmp int

    DECLARE @Year_Farsi int
    DECLARE @Month_Farsi int
    DECLARE @Day_Farsi int

    SET @Days = DATEDIFF(DAY, '19000320', @DateLatin)

    SET @Year_Farsi = 1279
    SET @Month_Farsi = 01
    SET @Day_Farsi = 01

    SET @Tmp = @Days / 365

    IF (@Tmp * 365) + ((@Tmp + 3) / 4) > @Days
    SET @Tmp = @Tmp - 1
    SET @Year_Farsi = @Year_Farsi + @Tmp
    SET @Days = @Days - (@Tmp * 365) - ((@Tmp + 3) / 4)

    IF @Days <= 186
    BEGIN
    SET @Tmp = @Days / 31
    SET @Month_Farsi = @Month_Farsi + @Tmp
    SET @Days = @Days - (@Tmp * 31)
    END
    ELSE
    BEGIN
    SET @Days = @Days - 186
    SET @Tmp = @Days / 30
    SET @Month_Farsi = @Month_Farsi + @Tmp + 6
    SET @Days = @Days - (@Tmp * 30)
    END
    SET @Day_Farsi = @Day_Farsi + @Days

    RETURN REPLACE(STR(@Year_Farsi, 4, 0) +
    STR(@Month_Farsi, 2, 0) +
    STR(@Day_Farsi,2, 0), ' ', '0')
    END

    2 - تبدیل تاریخ شمسی به میلادی:

    CREATE FUNCTION DateLatin(@DateFarsi CHAR(10))
    RETURNS DateTime AS
    BEGIN
    SET @DateFarsi = REPLACE(@DateFarsi, '/', '')

    DECLARE @Days BigInt

    DECLARE @Year_Farsi int
    DECLARE @Month_Farsi int
    DECLARE @Day_Farsi int

    SET @Year_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 1, 4))
    SET @Month_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 5, 2))
    SET @Day_Farsi = CONVERT(int, SUBSTRING(@DateFarsi, 7, 2))

    SET @Days = ((@Year_Farsi - 1279) * 365) + ((@Year_Farsi - 1276) / 4)

    IF @Month_Farsi <= 7
    SET @Days = @Days + ((@Month_Farsi - 1) * 31)
    ELSE
    SET @Days = @Days + ((@Month_Farsi - 7) * 30) + 186

    RETURN DATEADD(DAY, @Days + @Day_Farsi - 1, '19000320')
    END

    انشاء الله مقبول بیافتد.

  10. #50
    کاربر دائمی آواتار Arghavan_Reza
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    171

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    ساده است!
    بدون اینکه به این فکر کنید که سال کبیسه در سیستم های میلادی و شمسی کی است و چه ارتباطی با هم دارند و شروع سال میلادی در چه تاریخی از سال شمسی اتفاق می افتد یا بالعکس یا مثلا ماه های میلادی هر کدام چند روز است یا ... به این مسئله توجه کنید که تعداد روزهایی که از مبدا (یا مثلا 1/1/1279 شمسی یا 20/3/1900 میلادی ) تا الان (یا هر تاریخ مشخص دیگری) گذشته است در هر دو سیستم یکسان است. (شاید جابجایی سال کبیسه در سال 1375 شمسی به همین دلیل باشد.)
    و من الله توفیق ...

  11. #51
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    نقل قول نوشته شده توسط Arghavan_Reza مشاهده تاپیک
    ساده است!
    بدون اینکه به این فکر کنید که سال کبیسه در سیستم های میلادی و شمسی کی است و چه ارتباطی با هم دارند و شروع سال میلادی در چه تاریخی از سال شمسی اتفاق می افتد یا بالعکس یا مثلا ماه های میلادی هر کدام چند روز است یا ... به این مسئله توجه کنید که تعداد روزهایی که از مبدا (یا مثلا 1/1/1279 شمسی یا 20/3/1900 میلادی ) تا الان (یا هر تاریخ مشخص دیگری) گذشته است در هر دو سیستم یکسان است. (شاید جابجایی سال کبیسه در سال 1375 شمسی به همین دلیل باشد.)
    و من الله توفیق ...
    تعداد روزهای گذشته از مبدا برای همه تقویم ها یکسان هست و این پایه تبدیل تقویم ها به یکدیگر هست یعنی در تمام مبدلهای تقویم یک روز را مبدا فرض می کنند مثلا 1/1/1900 روز صفرم هست. حالا تعداد روزهای گذشته از این تقویم را داشته باشید می توانید به تقویم مورد نظر تبدیل کنید.
    حالا فرض کن روز 1/1/1900 روز صفرم تقویم ما باشد، حالا من می خواهم شما بفرمایید که روز 42148 ام را چگونه به تقویم شمسی و میلادی تبدیل می کنید؟

  12. #52
    کاربر دائمی آواتار Arghavan_Reza
    تاریخ عضویت
    اسفند 1384
    محل زندگی
    تهران
    پست
    171

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    حالا فرض کن روز 1/1/1900 روز صفرم تقویم ما باشد، حالا من می خواهم شما بفرمایید که روز 42148 ام را چگونه به تقویم شمسی و میلادی تبدیل می کنید؟
    محاسبه تعداد روزهای گذشته (42148) بخشی از وظیفه این توابع است، خیلی سخت نگیرید. می دانم برای آشنایی دیگران سوال کرده اید:
    در مورد این الگوریتم توضیحی میدی؟
    و حتما الگوریتم توابع فوق را خوب فهمیده اید.

  13. #53

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    با سلام و تشکر از همه دوستان و بحث هایی که بسیار مفید هستند.
    روش های متفاوتی مطرح شدند، در مورد روش sqlpro اضافه کردن یک فیلدchar 10 مهندسی نرم افزار را زیر سوال نبرده و باعث آنرمال شدن جداول نمی گردد.چون اصول نرمال سازی نسبی هستند و تئوریک و در بسیاری از مواقع CostBenefit در دنیای واقعی ما را به استفاده از روش های غیرقانونمند هدایت می کند.و باید هدف از نرمال سازی را بدانیم و در جاهایی که نیاز است رعایت کنیم.

    همچنین من یک نکته که خودم رعایت میکنم را به مطالب شما اضافه می کنم.چون بیشترین حالت استفاده از sql معماری کلاینت سرور است بهتر است بجای وارد کردن بار تبدیل تاریخ به sql تبدیل را در سطح UI انجام دهید و این یعنی تقسیم بار محاسبه به کلاینت ها

    در ضمن استفاده از جدول تاریخ های فارسی و join آن و ایجاد یک view نیز روش خوبی برای استفاده در سطح sql است.البته معماری برنامه در انتخاب روش تبدیل تاریخ موثر است.

    از همه بابت نظراتشان متشکرم.

  14. #54
    کاربر دائمی آواتار Kamyar.Kimiyabeigi
    تاریخ عضویت
    خرداد 1384
    محل زندگی
    تهران
    پست
    1,276

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    نقل قول نوشته شده توسط hamed-p مشاهده تاپیک
    روش آقای Kamyar.Kimiyabeigi درباره روز آخر سال درست عمل نمی‌كند!
    اون Function ايي كه من گذاشتم فقط براي آخرين روز سال كبيسه يعني 30 اسفند درست كار نميكند ولي براي 29 اسفند درست كار ميكنه

  15. #55

    Unhappy نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    سلام
    من مشکلی که دارم این هست که متاسفانه 360000 تاریخ شمسی دارم که به صورت رشته در جدول ذخیره شده.از طرفی نرم افزاری که من دارم استفاده می کنم فقط تاریخ میلادی رو میشناسه. کل این جریان هم رو وب هست پس باید قبل از upload تاریخ ها رو درست کنم.
    و اکر از الگوریتم استفاده کنم زمان load میره بالا ، اگر میتونین لطفاکمکم کنین تا این رشته ها رو به تاریخ میلادی تبدیل کنم در ضمن اگر کسی سورس هم تو سی شارپ داره برام بذاره ممنون می شم. بزرگترین مشکلم هم اینه که سیستم اجازه دستکاری تو داده با فرمت تاریخ رو بهم نمی ده ممنون

  16. #56
    کاربر دائمی
    تاریخ عضویت
    آبان 1385
    محل زندگی
    مشهد
    سن
    38
    پست
    449

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    سلام رفقا
    امروز بعد از تقریبا 2 سال مجدد تو این تاپیک اومدم ، تقریبا 2 سال پیش با استفاده از کدی که کاربر Linux گزاشته بود تو برنامه هام شروع به کار کردم و کد بسیار سریع و خوب اجرا میشه .
    تقریبا میشه گفت هیچ مشکلی باهاش ندارم
    بزرگترین ویو ما که اطلاعات کل سیستم رو نشون میده 32 هزار رکورد داره که با لحاظ کردن Union All حدود 30 جدوم و سورت بر روی فیلد تاریخ و تبدیل تاریخ میلادی به شمسی حدود 2 ثانیه طول میکشه که تمام داده ها رو لود کنه .

    و اما منظورم من از ارسال این پست ، نکته ای که به نظرم رسید میتونه مفید باشه اینه که در اکثر موارد داد های من و اکثر کاربران دیگر بصورت ذیل است :

    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    ...
    02/01/2001
    02/01/2001
    ...
    10/10/2001

    اگر کمی دقت کنید میتوانیم این تابع را کمی بهینه تر کنیم ، بدین معنی که برای رکورد اول تابع تبدیل تاریخ را انجام بدهد و برای رکوردهای بعدی اگر تاریخ نیاز به محاسبه داشت مجدد این محاسبه انجام شود در غیر این صورت تاریخ محاسبه شده در رکورد قبلی بازیابی شود .

    نمیدانم توانستم منظورم را برسانم یا نه ؟

    اینگونه فرض کنید برای تاریخ 15/01/2010 این تابع را فراخوانی کرده ایم و این تابع محاسبات را انجام میدهد و در رکورد بعدی هم همین تاریخ (که در رکورد قبلی یک بار تبدیل شده بود) را باید مجدد تبدیل کنیم ، حال اگر بتوانیم مقدار تاریخ قبلی را در متغییری قرار دهیم مشکل رفع میگردد .

    یعنی نیاز داریم در تابع 2 مقدار را ذخیره کنیم و بتوانیم در فراخوانی بعدی این مقادیر را بخوانیم ، یعنی یک چیزی تو مایه های متغییر های Static در C


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

  17. #57
    کاربر دائمی آواتار linux
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    تهران
    پست
    2,313

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    نقل قول نوشته شده توسط bad_boy_2007 مشاهده تاپیک
    سلام رفقا
    امروز بعد از تقریبا 2 سال مجدد تو این تاپیک اومدم ، تقریبا 2 سال پیش با استفاده از کدی که کاربر Linux گزاشته بود تو برنامه هام شروع به کار کردم و کد بسیار سریع و خوب اجرا میشه .
    تقریبا میشه گفت هیچ مشکلی باهاش ندارم
    بزرگترین ویو ما که اطلاعات کل سیستم رو نشون میده 32 هزار رکورد داره که با لحاظ کردن Union All حدود 30 جدوم و سورت بر روی فیلد تاریخ و تبدیل تاریخ میلادی به شمسی حدود 2 ثانیه طول میکشه که تمام داده ها رو لود کنه .

    و اما منظورم من از ارسال این پست ، نکته ای که به نظرم رسید میتونه مفید باشه اینه که در اکثر موارد داد های من و اکثر کاربران دیگر بصورت ذیل است :

    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    01/01/2001
    ...
    02/01/2001
    02/01/2001
    ...
    10/10/2001

    اگر کمی دقت کنید میتوانیم این تابع را کمی بهینه تر کنیم ، بدین معنی که برای رکورد اول تابع تبدیل تاریخ را انجام بدهد و برای رکوردهای بعدی اگر تاریخ نیاز به محاسبه داشت مجدد این محاسبه انجام شود در غیر این صورت تاریخ محاسبه شده در رکورد قبلی بازیابی شود .

    نمیدانم توانستم منظورم را برسانم یا نه ؟

    اینگونه فرض کنید برای تاریخ 15/01/2010 این تابع را فراخوانی کرده ایم و این تابع محاسبات را انجام میدهد و در رکورد بعدی هم همین تاریخ (که در رکورد قبلی یک بار تبدیل شده بود) را باید مجدد تبدیل کنیم ، حال اگر بتوانیم مقدار تاریخ قبلی را در متغییری قرار دهیم مشکل رفع میگردد .

    یعنی نیاز داریم در تابع 2 مقدار را ذخیره کنیم و بتوانیم در فراخوانی بعدی این مقادیر را بخوانیم ، یعنی یک چیزی تو مایه های متغییر های Static در C


    به این شکل تقریبا میشه گفت سرعت تابع بیش از 2 برابر میشود
    البته من این کد را برای sql sererv 2000 نوشته بودم که بعد ها با آمدن sql server 2005 و دات نت 2 با استفاده از کد های دات نت باز نویسی کردم.
    چیزی که شما می خواهید در این تابع قابل انجام نیست. شما می توانید موقع صدا کردن این تابع این کنترل را انجام دهید. البته با دستورات sql هم راحت نیست.

  18. #58
    منتظر تایید آدرس ایمیل
    تاریخ عضویت
    آذر 1387
    محل زندگی
    تهران
    پست
    848

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    دوستان خواهش میکنم یک لحظه تامل کنید
    بعضی دوستان یک جدول شمسی اظافه داشتند و با JOIN معادل شمسی یک تاریخ میلادی رو به دست میآوردند.
    عده ای دیگه که از یک سری FUN استفاده کردند که کندی خود الگوریتم و خود FUN و Cache نشدن آن بسیار مسئله زاست.
    بعضی ها اسم از VIEW آوردند که من نفهمیدم VIEW چه جوری قراره تو این سیستم کار کنه ؟
    استفاده از Cursor برای افزایش رکوردهای جدول شمسی هم که نوبر بود.
    ---
    دوستان مگر ما برنامه نویس پلتفرم Net. نیستیم ؟
    خب ما یک کلاس داریم که در سمت کلاینت که تاریخ میلادی رو به تاریخ جلالی یا همون شمسی تبدیل میکنه.
    و اصولا بحث بر سر کلاینت نیست.
    خب با CLR Programming یک Type هم در سمت سرور درست کنیم مثلا با نام جلالی که در خودش تاریخ شمسی نگه داری کند.
    هم سریع است.
    هم اعتبارسنجی اش با خودش است.
    هم میتوان یک سری متد به آن اظافه کرد؛ که مثلا نام کامل ماه را برگرداند و ... .
    یه بنده خدایی چند صد سال قبل نشسته بدون هیچ امکاناتی مسائلی رو حساب کرده که هنوز که هنوزه اون محاسبات بالاترینه و تقویم ما دقیق ترین تقویم دنیاست.
    تن اون بنده خدا رو تو قبر نلرزونیم.
    تازه شما خودتون حساب کنید فرضا اگه این تاپیک ترجمه شه و بیفته دست یکسری مثلا هندی چه جوری مضحکه میشیم ؟
    در نهایت برای اون سری از دوستانی که فعلا تاریخ میلادی دارند؛ میتونن یک سری کل میلادیهاشون رو بخونند و پس از تبدیل با کد C#‎‎ در فیلد جلالی بنویسند.
    و اونهایی که شمسی رو به صورت nchar10 ذخیره کردند؛ در همان کلاسی که تاریخ میلادی رو به شمسی تبدیل میکنه؛ میتونین شمسی رو به صورت سال و ماه و روز جدا بدید و میلادی تحویل بگیرید.
    هر چند من خودم با extension method اینها رو به DateTime و SHAMSIUDT اظافه کردم.
    دیگه به نظر من مشکلی نمی مونه جز اینکه اون تایپ جلالی.
    باور کنید من اگر میتوانستم اون رو در اختیارتون میذاشتم. ولی چنین اختیاری ندارم.
    اما کد C#‎‎ اون رو در اختیارتون میذارم هر چند که با اطلاعاتی که در بعضی از دوستان میبینم میدونم کامل تر از این رو میتونند طراحی کنند؛ به چند دلیل :
    در طراحی Validation جدی گرفته نشده چون من از کمپوننت DateTime Picker استفاده میکنم هم برای شمسی، هم برای جلالی و اونها به خوبی مسائل کبیسه و خبیسه و ... رو در نظر گرفتن.
    از extension method استنفاده بیهوده نکنید ؛ حتی این استفاده من هم بی جا بوده است.
    در ضمن فکر میکنم حداقل صحیح ترین راه حل مسئله رو گفتم
    دوستان اگر نظری دارند و اشکالی در راه حل من میبینند بگویند.
    موفق باشید
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله sia_2007 : شنبه 26 دی 1388 در 12:05 عصر دلیل: درج فایل ضمیمه

  19. #59
    کاربر جدید
    تاریخ عضویت
    بهمن 1381
    محل زندگی
    مشهد
    پست
    22

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    با سلام آقای linux.
    من کدی که گذاشته اید را امتحان کردم. در تبدیل تاریخ میلادی به شمسی یک روز جلوتر را نمایش می دهد. فکر می کنید چرا اینطور است. آیا اگر عددی که در تابع Civil2Persian گذاشته اید بجای 2415021 عددد 2415020 بگذاریم مشکل حل می شود؟

  20. #60

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    نقل قول نوشته شده توسط mnodehi مشاهده تاپیک
    با سلام آقای linux.
    من کدی که گذاشته اید را امتحان کردم. در تبدیل تاریخ میلادی به شمسی یک روز جلوتر را نمایش می دهد. فکر می کنید چرا اینطور است. آیا اگر عددی که در تابع Civil2Persian گذاشته اید بجای 2415021 عددد 2415020 بگذاریم مشکل حل می شود؟
    من هم كد را از آقاي linux گرفتم و بدون مشكل در حال كار است

  21. #61

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    سلام
    برای تاریخ شمسی میشه دستورات vb رو وارد sql کرد .می دونین که vb 2008 به بالا تقیم شمسی و داخلش داره و راحت تاریخ میلادی و تبدیل میکنه حتی ماههای 30 و31 روزه هم در نظر میگیره

  22. #62

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

    با سلام
    من اين دو تا تابع را نوشتم
    براتون ميگذارم تا شما و بقيه هم استفاده كنيد
    فايلها txt هستند ميتوانيد كد موجود را در SQL كپي و اجرا كنيد.
    فایل های ضمیمه فایل های ضمیمه

  23. #63

    نقل قول: تاریخ میلادی رو چطوری به شمسی تبدیل کنم بوسیله sql ؟

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

    در تبدیل تاریخ شمسی به میلادی و بلعکس با مطالعه کمی که در این سایت نمودم تنها تجربه خویش را بازگو می کنم:
    بعضی زمانها می بایست در سطح تنها sql این تبدیل صورت گیرد و برخی موارد در خود برنامه موردی ندارد، بطور مثال اگر Procedure در sql نوشته شده باشد و بخاطر عملیات ریاضی که در آن صورت پذیرفته یا به هر دلیلی که باعث تکرار رکوردها و ایجاد اشکال در جواب می نماید تنها می توان تاریخ را در قسمت مثلا where آورد پس کلیه عملیات در سطح sql است گرچه با آمدن linq تا حد زیادی این مشکل برطرف شده اما نه کاملا شایدم من مسلط نیستم ضمنا function های موجود در این سایت نیز صحیح عمل می کنند، لذا با توجه به شرایط راه حل انتخاب می گردد. خود من هم در net. هم در sql این تبدیل را با در نظر گرفتن شرایط موجود انجام می دهم. ضمنا کاربر محترم Kamyar.Kimiyabeigi بسیار ممنون. با تشکر شادمانی
    آخرین ویرایش به وسیله shadmani : دوشنبه 24 خرداد 1389 در 15:14 عصر

صفحه 2 از 2 اولاول 12

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •