ورود

View Full Version : حساب فاصله زمانی شمسی بین رکوردها



mhsmity
شنبه 21 تیر 1393, 19:51 عصر
سلام.
برای بدست اوردن ستون فاصله زمانی کد نویسی کدام سمت رو پیشنهاد می کنید سمت C#‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎ یا اسکیول و یا کریستال ریپورت؟ یه نمونه کد هم بزارین.
من قصد درام یه آموزش جامع و کامل درباره فاصله زمانی بین رکورد ها، داخل همین پست ایجاد کنم که خیلی خیلی به نظرات و پشنهادات شما بستگی داره نکته جالب اینکه تصیمیم دارم که فقط و فقط با تاریخ شمسی کار بشه و نه میلادی.
اول از اسکیول
دوم سی شارپ
سوم کریستال شروع خواهیم کرد.

به نظر من چون اسکیول قدرت و پردازش بالا داره بهتر که سمت اسکیول باشه ولی شما هم نظر خودتون رو بگین و چرا ؟

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



Date
Space


1390/01/01
0


1390/01/03
2 روز


1390/05/03
125 روز


1392/05/03
02/00/00


1394/07/05
02/02/02



فاصله زمانی رو از سمت چپ به ترتیب سال، ماه و روز بخوانید
مثلا سطر آخر 2 سال و 2 ماه و 2 روز
-------------------------------------------------------------------------------------------------------------------------------------------------
داخل همین سایت این توابع رو پیدا کردم کردم هر دو این تابع رو یادتون باشه که Create کنید.
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER FUNCTION fn_ShamsiDateStrPart (@ADateStr varchar(10), @ADatePart char)
RETURNS int
AS
BEGIN
declare @FY varchar(4), @FM varchar(2), @FD varchar(2),
@SlashPos1 int, @SlashPos2 int
if @ADateStr = '' return null
set @SlashPos1 = CHARINDEX('/', @ADateStr)
if (@SlashPos1 = 0) or ((@SlashPos1 <> 3) and (@SlashPos1 <> 5)) return null
set @SlashPos2 = CHARINDEX('/', @ADateStr, @SlashPos1 + 1)
if @SlashPos2 = 0 return null
set @FY = Cast(SUBSTRING (@ADateStr, 1 , @SlashPos1 - 1 ) as int)
set @FM = Cast(SUBSTRING (@ADateStr, @SlashPos1 + 1, @SlashPos2 - @SlashPos1 - 1) as int)
set @FD = Cast(SUBSTRING (@ADateStr, @SlashPos2 + 1, LEN(@ADateStr) - @SlashPos2) as int)
return
case @ADatePart
when 'Y' then @FY
when 'M' then @FM
when 'D' then @FD
end
END
go
ALTER FUNCTION [dbo].[fn_ShamsiDateStrDiffDay] (@FDate varchar(10), @LDate varchar(10))
RETURNS int
AS
BEGIN
declare @FY int, @FM int, @FD int, @LY int, @LM int, @LD int,
@FirstM int, @FirstD int, @LastM int, @LastD int,
@YDiff int, @LDiff int, @FDiff int
set @FY = dbo.fn_ShamsiDateStrPart(@FDate, 'Y')
set @FM = dbo.fn_ShamsiDateStrPart(@FDate, 'M')
set @FD = dbo.fn_ShamsiDateStrPart(@FDate, 'D')
set @LastM = 12
set @LastD = 30
set @LDiff = ((@LastM - @FM) * 30) + (@LastD - @FD)
set @LY = dbo.fn_ShamsiDateStrPart(@LDate, 'Y')
set @LM = dbo.fn_ShamsiDateStrPart(@LDate, 'M')
set @LD = dbo.fn_ShamsiDateStrPart(@LDate, 'D')
set @FirstM = 1
set @FirstD = 1
set @FDiff = ((@LM - @FirstM) * 30) + (@LD - @FirstD)+1
set @YDiff = (@LY - (@FY + 1)) * 360;
return @LDiff + @FDiff + @YDiff
END
go
select dbo.fn_ShamsiDateStrDiffDay('1391/01/01','1392/01/01');

همین طور که می بینید اختلاف بین دو تاریخ رو به تعداد روز برای شما محاسبه می کنید.
و ان رو در ستونی با نام SpaceDay می ریزد
select dbo.fn_ShamsiDateStrDiffDay('1391/01/01','1392/01/01') as SpaceDay;
----------------------------------------------------------------------------------
من که در نظر دارم مثل دیونه ها اینجا تنهای با خودم حرف بزم
اخه هیچکی این روزها اینجا نیست. چقدر سوال بی جواب دارم.

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

mhsmity
شنبه 21 تیر 1393, 20:46 عصر
سلام فرض کنید تابع فوق در یک Select ساده استفاده بشه.
حالا چطوری باید ورودی های این تابع رو مشخص کنم به طوری که بیاد ، تاریخ رکورد قبلی رو با رکودر فعلی از هم تفریق کنه.
select ِ Date1,dbo.fn_ShamsiDateStrDiffDay(Date1, Date1 مقدار رکورد قبلی) as SpaceDay from Table1

ساده ترین راه چیه ؟