PDA

View Full Version : مقایسه فاصله تاریخی رکورد به رکورد



پوریا_م
یک شنبه 15 اسفند 1389, 09:21 صبح
با سلام
جدولی با فیلدهای زیر رو در نظر بگیرید :
GoodCode int
OrderDate datetime

در این جدول کد کالاها و تاریخ سفارشات ثبت میشن.حالا من میخوام کد کالا رو بدم و فاصله زمانی بین دو سفارش مجاور (مثلا رکورد 1 با رکورد 2، رکورد 2 با رکورد 3 و الی آخر) چک بشه و اگر مثلا بیشتر از 25 روز بود انتخاب بشن.
فکر کنم باید از کرسر استفاده کنم.
ممنون میشم در این مورد راهنمائی لازم رو بفرمائید.

Reza_Yarahmadi
یک شنبه 15 اسفند 1389, 10:34 صبح
روشهای متفاوتی برای این کار وجود داره یک راه Join کردن جدول با خودشه ، به نمونه کد زیر با داده های پیش فرضش توجه کنید
CREATE TABLE TableName(
GoodCode int NULL,
OrderDate datetime NULL
)


Insert Into dbo.TableName Values(1, 'Jan 1 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Feb 1 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Feb 5 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 25 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 26 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 29 2011 12:00AM')


Declare @GoodCode int
Set @GoodCode = 1

;With res as(
Select
Row_Number() Over(Order by OrderDate) as Id,
*
From
TableName
Where
GoodCode = @GoodCode
)
Select
r1.GoodCode,
r1.OrderDate as Date1,
r2.OrderDate as Date2,
DateDiff(Day, r1.OrderDate, r2.OrderDate) as DateDiff
From
res r1 Inner join res r2
On
r1.Id + 1 = r2.Id


Drop Table TableName

روش دیگه استفاده از کرسر است (البته من این روش رو پیشنهاد نمیکنم).

پوریا_م
یک شنبه 15 اسفند 1389, 11:41 صبح
ممنون از کد خوبتون.
من از SQL Server 2000 استفاده میکنم و ()Row_Number ....
چه تغییری بدم که در 2000 جواب بده ؟
سپاس مجدد.

Reza_Yarahmadi
یک شنبه 15 اسفند 1389, 14:13 عصر
2000 محدودیت ها خیلی زیادی داره!
در صورتی که تعداد رکوردها خیلی زیاد نیست (کمتر از 100هزار رکورد) میتونید از روش زیر استفاده کنید
CREATE TABLE TableName(
GoodCode int NULL,
OrderDate datetime NULL
)


Insert Into dbo.TableName Values(1, 'Jan 1 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Feb 1 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Feb 5 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 25 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 26 2011 12:00AM')
Insert Into dbo.TableName Values(1, 'Mar 29 2011 12:00AM')


Declare @GoodCode int
Set @GoodCode = 1


Select
r1.GoodCode,
r1.OrderDate as Date1,
r2.OrderDate as Date2,
DateDiff(Day, r1.OrderDate, r2.OrderDate) as DateDiff
From
(Select
ID = count(*),
T1.GoodCode,
T1.OrderDate
From
TableName T1, TableName T2
Where
T1.OrderDate >= T2.OrderDate
AND
T1.GoodCode = @GoodCode
Group By
T1.OrderDate, T1.GoodCode) r1
Inner Join
(Select
ID = count(*),
T1.GoodCode,
T1.OrderDate
From
TableName T1, TableName T2
Where
T1.OrderDate >= T2.OrderDate
AND
T1.GoodCode = @GoodCode
Group By
T1.OrderDate, T1.GoodCode) r2
On
r1.Id + 1 = r2.Id


Drop Table TableName
ولی در صورتیکه تعداد کل رکوردها زیاده فکر کنم کرسر بهینه تر باشه.