View Full Version : سوال: گزارش گیری با تاریخ فارسی
  
pishraft
یک شنبه 16 آبان 1389, 18:02 عصر
سلام دوستان
می خوام توی برناممم از تاریخ فارسی استفاده کنم و توی دیتابیس ذخیرش کنم
چطور می تونم بعدا گزارش گیریم رو بر اساس تاریخ انجام بدم؟ (یعنی تاریخ فارسی)
ممنون میشم راهنماییم کنید
melika999
یک شنبه 16 آبان 1389, 21:40 عصر
منم اين مشكلو داشتم
در اين حد ميدونم نياز به يه تايع داره كه تو خود كريستال ريپورت تعريف ميشه 
در واقع واسه فيلد فرمول مينويسيم
Reza_Yarahmadi
یک شنبه 16 آبان 1389, 21:46 عصر
تاریخ ر وبصورت رشته ای ذخیره کنید زمان واکشی هم فرضا اگر بخواید بین 2 تاریخ رو چک کنید میتونید به روش زیر عمل کنید
Select * From TableName Where DateValue Between @Date1 AND @Date2
DateValue اسم فیلد تاریخ است.
Masoome_das
دوشنبه 17 آبان 1389, 00:28 صبح
تاریخ ر وبصورت رشته ای ذخیره کنید زمان واکشی هم فرضا اگر بخواید بین 2 تاریخ رو چک کنید میتونید به روش زیر عمل کنید
چطور می شه مقدار مابین دو رشته را پیدا کرد ، رشته که عدد نیست اون هم تاریخ که از کاراکتر های خاص مثل 
/  درش استفاده شده.
می خوام توی برناممم از تاریخ فارسی استفاده کنم و توی دیتابیس ذخیرش کنم
برای زبان Sql تاریخ فارسی معنی دارد
شما با انجام این کار بسیاری از امکاناتی که می توانید برای پردازش تاریخ در Sql  از آن استفاده کنید را از دست می دهید
شما حتی المقدور باید تاریخ را به صورت میلادی در SQL  ذخیره کنید و برای نمایش تاریخ بصورت شمسی از توابع مولد استفاده کنید که به راحتی قابل دسترس همه هست.
Reza_Yarahmadi
دوشنبه 17 آبان 1389, 12:54 عصر
چطور می شه مقدار مابین دو رشته را پیدا کرد ، رشته که عدد نیست اون هم  تاریخ که از کاراکتر های خاص مثل 
/  درش استفاده شده.همون طور که نوشتم میشه! دوست عزیز قبل از اینکه ایراد بگیرید و با چیزی مخالفت کنید اول امتحان کنید!!
برای پیدا کردن بین 2 رشته SQL بصورت زیر عمل میکنه
کاراکتر اول رکورد مورد نظر رو با کاراکتر اول 2 پارامتر مقایسه میکنه ، اگر بینشون بود که نتیجه مورد نظر است و اونو نمایش میده ، اگر بینشون هم  نبود که یعنی نتیجه دلخواه نیست و نمایش نمیده ولی اگر این کاراکتر با 2 کاراکتر پارامتر مساوی بود به سراغ کاراکتر بعدی میره. این جلو رفتن تا زمانی انجام میشه که به یکی از شرایط بالا برسه. (این نکته هم لازم به ذکر که در حالت عادی عملگرهای <=> به کوچکی و بزرگی حروف وابسته نیستند)
برای زبان Sql تاریخ فارسی معنی دارد
شما با انجام این کار بسیاری از امکاناتی که می توانید برای پردازش تاریخ  در Sql  از آن استفاده کنید را از دست می دهید
شما حتی المقدور باید تاریخ را به صورت میلادی در SQL  ذخیره کنید و برای  نمایش تاریخ بصورت شمسی از توابع مولد استفاده کنید که به راحتی قابل دسترس  همه هست.         ذخیره تاریخ بصورت میلادی کاملا توصیه میشه ، سرعت پردازش به مراتب بالاتر میره ، از تابع نوشته شده برای تبدیل تاریخ ها هم میشه توی برنامه های دیگه هم استفاده کرد
M.YasPro
دوشنبه 17 آبان 1389, 18:36 عصر
سلام
من به این صورت عمل می کنم :
توی اینزرت : تاریخ شمسی رو از کاربر می گیرم و زمان درج تبدیل به میلادی می کنم .
توی select : تاریخ میلادی رو میگیرم و وقتی می خوام توی datatable یا object یا ... بریزم ، تبدیل به شمسی می کنم .
اینجوری توی دیتابیسم تاریخ میلادی دارم و می تونم از توابع بسیار مفید date توی T-Sql استفاده کنم .
موفق باشید .
sajjad_kochekian
چهارشنبه 03 آذر 1389, 22:57 عصر
سلام
من به این صورت عمل می کنم :
توی اینزرت : تاریخ شمسی رو از کاربر می گیرم و زمان درج تبدیل به میلادی می کنم .
توی select : تاریخ میلادی رو میگیرم و وقتی می خوام توی datatable یا object یا ... بریزم ، تبدیل به شمسی می کنم .
اینجوری توی دیتابیسم تاریخ میلادی دارم و می تونم از توابع بسیار مفید date توی T-Sql استفاده کنم .
موفق باشید .
میشه بگید از چه تابعی استفاده می کنید؟
آیا با Persian Calender  هم میشه این کار را کرد.
و توی چه رویدادی باید این تبدیل انجام بشه که هم توی گرید بشه نشونش داد و هم داخل فرم.
e.Rezaei
پنج شنبه 04 آذر 1389, 11:24 صبح
با سلام 
اين كه موقع ذخيره كردن تاريخو به ميلادي تبديل كنيم و براي نمايش، دوباره اونو به شمسي برگردونيم ، خيلي معموله ولي زياد جالب نيست . من يه روش ساده تر مد نظرم هست .
بيايم موقع ثبت تاريخو به صورت يه عدد در نظر بگيريم و براي نمايش اگر از كريستال استفاده مي شه كه به راحتي مي تونيم با درست كردن يه فرمولا فيلد تاريخي رو كه با فرمت يه عدد ذخيره شده  مثل 13890902 رو به صورت 02/09/1389 نمايش بديم . شايد سئوال پيش بياد كه حالا چرا با فرمت عدد ؟ اين طوري اگه بخوايم با دستورات linq هم select ي رو روي تاريخ داشته باشيم ، مشكلي پيش نمي ياد . نظرتون چيه ؟
hakelberfin
پنج شنبه 04 آذر 1389, 14:37 عصر
سلام دوستان
برای کار با توابع تاریخ بهتره که بصورت میلادی و با فرمت DateTime ذخیره بشن.
به نظر من روشی که دوستمون M.YasPro (http://www.barnamenevis.org/forum/member.php?u=50429) گفتن روش کاملا درستیه.
این تابع رو به توابع SQL تون اضافه کنید با اون میتونید تاریخ میلادی رو به شمسی تبدیل کنید. کاملا هم تست شده است
 ALTER FUNCTION [dbo].[GetSolarDate] (@DateTime DATETIME)  
RETURNS CHAR(10) AS
BEGIN
    IF (@DateTime = '')
        RETURN ''
    DECLARE @yy AS INT            -- year
    DECLARE @mm AS INT            -- month
    DECLARE @dd AS INT            -- day
    DECLARE @DateString AS NVARCHAR(10)    -- yy/mm/dd
    DECLARE @M1 AS INT                -- days of month 1
    DECLARE @M2 AS INT                -- days of month 2
    DECLARE @M3 AS INT                -- days of month 3
    DECLARE @M4 AS INT                -- days of month 4
    DECLARE @M5 AS INT                -- days of month 5
    DECLARE @M6 AS INT                -- days of month 6
    DECLARE @M7 AS INT                -- days of month 7
    DECLARE @M8 AS INT                -- days of month 8
    DECLARE @M9 AS INT                -- days of month 9
    DECLARE @M10 AS INT            -- days of month 10
    DECLARE @M11 AS INT            -- days of month 11
    DECLARE @Total AS INT            -- total days of miladi date
    DECLARE @TotalSolar AS INT        -- total days of solar date
    SET @M1 = 31
    SET @M2 = 28                    
    SET @M3 = 31
    SET @M4 = 30
    SET @M5 = 31
    SET @M6 = 30
    SET @M7 = 31
    SET @M8 = 31
    SET @M9 = 30
    SET @M10 = 31
    SET @M11 = 30
    -- get yy , mm , dd from DateTime
    -- *****************************************
    SET @yy = DATEPART(YEAR, @DateTime)
    SET @mm = DATEPART(MONTH, @DateTime)
    SET @dd = DATEPART(DAY, @DateTime)
    IF @yy % 4 = 0                    -- leap year
        SET @M2 = 29
    -- calculating total days of miladi year
    -- *****************************************
    IF @mm = 1
        SET @Total = @dd
    IF @mm = 2
        SET @Total = @dd + @M1
    IF @mm = 3
        SET @Total = @dd + @M1 + @M2
    IF @mm = 4
        SET @Total = @dd + @M1 + @M2 + @M3
    IF @mm = 5
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4
    IF @mm = 6
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5
    IF @mm = 7
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6
    IF @mm = 8
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7
    IF @mm = 9
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8
    IF @mm = 10
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9
    IF @mm = 11
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9 + @M10
    IF @mm = 12
        SET @Total = @dd + @M1 + @M2 + @M3 + @M4 + @M5 + @M6 + @M7 + @M8 + @M9 + @M10 + @M11
    -- calculating yy of solar year
    -- *****************************************
    IF @Total <= 79
        SET @yy = @yy - 622
    ELSE
        SET @yy = @yy - 621
    -- calculating total days of solar year
    -- *****************************************
    IF @Total > 79    -- ater new solar year
        SET @TotalSolar = @Total - 79
    ELSE    -- before new solar year
    BEGIN
        IF ((@yy + 1) % 4 = 0)    -- leap year
            SET @TotalSolar = @Total + 287
        ELSE    -- normal year
            SET @TotalSolar = @Total + 286
    END
    
    -- calculating mm, dd of solar year
    -- *****************************************
    IF @TotalSolar <= 186    -- 1st half of solar year
    BEGIN
        SET @mm = 1
        WHILE @TotalSolar > 31
        BEGIN
            SET @TotalSolar = @TotalSolar - 31
            SET @mm = @mm + 1
        END
    END
    ELSE    -- 2nd half of solar year
    BEGIN
        SET @TotalSolar = @TotalSolar - 186
        SET @mm = 7
        WHILE @TotalSolar > 30
        BEGIN
            SET @TotalSolar = @TotalSolar - 30
            SET @mm = @mm + 1
        END
    END
    
    SET @dd = @TotalSolar
--    SET @yy  = @yy % 100    -- 2 least digits (0~99)
    SET @DateString = LTRIM(RTRIM(STR(@yy/ 1000)))                -- y    : 1000
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 1000) / 100))    -- yy    : 100
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 100)/ 10))    -- yyy    : 10
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@yy % 10)))        -- yyyy    : 1
    SET @DateString = @DateString + '/'                    -- yyyy/
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@mm / 10)))        -- yyyy/m
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@mm % 10)))        -- yyyy/mm
    SET @DateString = @DateString + '/'                    -- yyyy/mm/
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@dd / 10)))        -- yyyy/mm/d
    SET @DateString = @DateString + LTRIM(RTRIM(STR(@dd % 10)))        -- yyyy/mm/dd
    RETURN @DateString
END 
و از اون در دستور SELECT استفاده کنید
مثلا
 "SELECT dbo.GetSolarDate(DateInDataBase) AS Date FROM TableName"
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.