PDA

View Full Version : سوال: گزارش گیری با تاریخ فارسی



pishraft
یک شنبه 16 آبان 1389, 17:02 عصر
سلام دوستان
می خوام توی برناممم از تاریخ فارسی استفاده کنم و توی دیتابیس ذخیرش کنم
چطور می تونم بعدا گزارش گیریم رو بر اساس تاریخ انجام بدم؟ (یعنی تاریخ فارسی)
ممنون میشم راهنماییم کنید

melika999
یک شنبه 16 آبان 1389, 20:40 عصر
منم اين مشكلو داشتم
در اين حد ميدونم نياز به يه تايع داره كه تو خود كريستال ريپورت تعريف ميشه
در واقع واسه فيلد فرمول مينويسيم

Reza_Yarahmadi
یک شنبه 16 آبان 1389, 20:46 عصر
تاریخ ر وبصورت رشته ای ذخیره کنید زمان واکشی هم فرضا اگر بخواید بین 2 تاریخ رو چک کنید میتونید به روش زیر عمل کنید

Select * From TableName Where DateValue Between @Date1 AND @Date2
DateValue اسم فیلد تاریخ است.

Masoome_das
یک شنبه 16 آبان 1389, 23:28 عصر
تاریخ ر وبصورت رشته ای ذخیره کنید زمان واکشی هم فرضا اگر بخواید بین 2 تاریخ رو چک کنید میتونید به روش زیر عمل کنید


چطور می شه مقدار مابین دو رشته را پیدا کرد ، رشته که عدد نیست اون هم تاریخ که از کاراکتر های خاص مثل
/ درش استفاده شده.


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

برای زبان Sql تاریخ فارسی معنی دارد
شما با انجام این کار بسیاری از امکاناتی که می توانید برای پردازش تاریخ در Sql از آن استفاده کنید را از دست می دهید
شما حتی المقدور باید تاریخ را به صورت میلادی در SQL ذخیره کنید و برای نمایش تاریخ بصورت شمسی از توابع مولد استفاده کنید که به راحتی قابل دسترس همه هست.

Reza_Yarahmadi
دوشنبه 17 آبان 1389, 11:54 صبح
چطور می شه مقدار مابین دو رشته را پیدا کرد ، رشته که عدد نیست اون هم تاریخ که از کاراکتر های خاص مثل
/ درش استفاده شده.همون طور که نوشتم میشه! دوست عزیز قبل از اینکه ایراد بگیرید و با چیزی مخالفت کنید اول امتحان کنید!!
برای پیدا کردن بین 2 رشته SQL بصورت زیر عمل میکنه
کاراکتر اول رکورد مورد نظر رو با کاراکتر اول 2 پارامتر مقایسه میکنه ، اگر بینشون بود که نتیجه مورد نظر است و اونو نمایش میده ، اگر بینشون هم نبود که یعنی نتیجه دلخواه نیست و نمایش نمیده ولی اگر این کاراکتر با 2 کاراکتر پارامتر مساوی بود به سراغ کاراکتر بعدی میره. این جلو رفتن تا زمانی انجام میشه که به یکی از شرایط بالا برسه. (این نکته هم لازم به ذکر که در حالت عادی عملگرهای <=> به کوچکی و بزرگی حروف وابسته نیستند)


برای زبان Sql تاریخ فارسی معنی دارد
شما با انجام این کار بسیاری از امکاناتی که می توانید برای پردازش تاریخ در Sql از آن استفاده کنید را از دست می دهید
شما حتی المقدور باید تاریخ را به صورت میلادی در SQL ذخیره کنید و برای نمایش تاریخ بصورت شمسی از توابع مولد استفاده کنید که به راحتی قابل دسترس همه هست. ذخیره تاریخ بصورت میلادی کاملا توصیه میشه ، سرعت پردازش به مراتب بالاتر میره ، از تابع نوشته شده برای تبدیل تاریخ ها هم میشه توی برنامه های دیگه هم استفاده کرد

M.YasPro
دوشنبه 17 آبان 1389, 17:36 عصر
سلام
من به این صورت عمل می کنم :
توی اینزرت : تاریخ شمسی رو از کاربر می گیرم و زمان درج تبدیل به میلادی می کنم .
توی select : تاریخ میلادی رو میگیرم و وقتی می خوام توی datatable یا object یا ... بریزم ، تبدیل به شمسی می کنم .
اینجوری توی دیتابیسم تاریخ میلادی دارم و می تونم از توابع بسیار مفید date توی T-Sql استفاده کنم .
موفق باشید .

sajjad_kochekian
چهارشنبه 03 آذر 1389, 21:57 عصر
سلام
من به این صورت عمل می کنم :
توی اینزرت : تاریخ شمسی رو از کاربر می گیرم و زمان درج تبدیل به میلادی می کنم .
توی select : تاریخ میلادی رو میگیرم و وقتی می خوام توی datatable یا object یا ... بریزم ، تبدیل به شمسی می کنم .
اینجوری توی دیتابیسم تاریخ میلادی دارم و می تونم از توابع بسیار مفید date توی T-Sql استفاده کنم .
موفق باشید .

میشه بگید از چه تابعی استفاده می کنید؟

آیا با Persian Calender هم میشه این کار را کرد.
و توی چه رویدادی باید این تبدیل انجام بشه که هم توی گرید بشه نشونش داد و هم داخل فرم.

e.Rezaei
پنج شنبه 04 آذر 1389, 10:24 صبح
با سلام
اين كه موقع ذخيره كردن تاريخو به ميلادي تبديل كنيم و براي نمايش، دوباره اونو به شمسي برگردونيم ، خيلي معموله ولي زياد جالب نيست . من يه روش ساده تر مد نظرم هست .
بيايم موقع ثبت تاريخو به صورت يه عدد در نظر بگيريم و براي نمايش اگر از كريستال استفاده مي شه كه به راحتي مي تونيم با درست كردن يه فرمولا فيلد تاريخي رو كه با فرمت يه عدد ذخيره شده مثل 13890902 رو به صورت 02/09/1389 نمايش بديم . شايد سئوال پيش بياد كه حالا چرا با فرمت عدد ؟ اين طوري اگه بخوايم با دستورات linq هم select ي رو روي تاريخ داشته باشيم ، مشكلي پيش نمي ياد . نظرتون چيه ؟

hakelberfin
پنج شنبه 04 آذر 1389, 13: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"