PDA

View Full Version : محاسبه اختلاف بین رکوردها در یک جدول با T-SQL



nAVA470
چهارشنبه 16 شهریور 1390, 14:00 عصر
من یک جدول دارم که دارای سه فیلد Id-Start-Finish هست. ( ID رکورد اول 1 وID رکود دوم 2) بطور مثال
من میخواهم اختلاف زمان بین تاریخ پایان رکورد اول با شروع رکورد دوم را محاسبه کنم.
با t-Sql ، به نظر شما امکان پذیر هست؟
ممنون از لطفتون

mehran_sh_t
چهارشنبه 16 شهریور 1390, 15:11 عصر
به نظر که ساده میاد، یک بار دوتا فیلد از رکورد اول رو از هم کم می کنید، یک بار هم دو تت فیلد دوم. بعد هم این دو تا رو...
هر کدوم از نتایج رو توی یک متغیر بریزید
اگر تو کدش مشکل داشتید بگید، خودم امتحان نکردم!

Galawij
چهارشنبه 16 شهریور 1390, 16:19 عصر
سلام دوست عزیز،
بله امکان پذیر هست، از طریق تابع () Row_number شماره سطر جدول را برگردانید و از طریق تابع DATEDIFF(datepart,startdate,enddate) اختلاف را با روز، ساعت، دقیقه و ... به دست بیاورید.

nAVA470
پنج شنبه 17 شهریور 1390, 07:48 صبح
ممنون از جواب هاتون
ولی من منظورم به صورت کلی این است که میخواهم اختلاف بین تاریخهای رکوردها رو پیدا کنم. ساده بگم من یک ای دی دارم و یک تاریخ،میخواهم اختلاف بین تاریخها رو بین رکورد ها پیدا کنم .(در Sql) با یک view یا Sp .من نمیخواهم اختلاف بین دو تا فیلد رو بدست بیارم،بلکه اختلاف بین رکوردها رو میخواهم.

Galawij
پنج شنبه 17 شهریور 1390, 09:06 صبح
سلام،
من که روش را خدمت شما عرض کردم. براتون یک مثال می ذارم، خودتون کامل ترش کنید(شرط ID را لحاظ کنید).
این برای فراخوانی روال:

Create PROCEDURE ReturnDateDiff(@ronum1 int , @ronum2 int,@idNum int)

این هم برای ساختار داخلی SP:

;With FirstDate as (
select * from (
select JulianDateReport AS FirstDate,ROW_NUMBER()OVER(ORDER BY IdDateReport)AS RowNum From dbo.TbDateReport) Result where (RowNum=@ronum1)
)
,SecondDate as (
select * from (
select JulianDateReport AS SecondDate,ROW_NUMBER()OVER(ORDER BY IdDateReport)AS RowNum From dbo.TbDateReport) Result where (RowNum=@ronum2)
)
Select DateDiff(Day,FirstDate.FirstDate,SecondDate.Second Date) From FirstDate Cross JOIN SecondDate

nAVA470
یک شنبه 20 شهریور 1390, 09:04 صبح
منظورتون از شرط ID رو متوجه نمیشم.اگه بیشتر توضیح بدید ممنون می شم.

Galawij
یک شنبه 20 شهریور 1390, 12:26 عصر
سلام،
من فکر می کردم که ID در این جدول کلید خارجی هست.
لزومی به اعمال این شرط نیست، فقط باید شماره سطر ها را پاس بدید و اینکه پارامتر ورودی مربوط به ID را پاک کنید.

Reza_Yarahmadi
یک شنبه 20 شهریور 1390, 23:12 عصر
بصورت کلی اگه بخواید برای یک مجموعه رکورد (بیش از 2 رکورد) نتیجه مورد نظرتون رو بدست بیارید اگر ID رکورد ها کاملا پشت سر هم هستند و رکوردی حذف نشده باشه
Select
T1.Name,
DateDiff(Day, T2.StartDate, T1.EndDate)
From
TableName T1 INNER JOIN TableName T2
ON
T2.ID = T1.ID + 1
اگر هم رکوردهایی حذف شده و مابین شماره IDها فاصله افتاده است و همچنین از SQL Server 2005 به بالا استفاه میکنید
With tbl as (
Select
*,
Row_Number() Over(Order By ID) as RowNum
From
TableName
)
Select
T1.ID,
DateDiff(Day, T2.StartDate, T1.EndDate) as DateDiff
From
tbl T1 INNER JOIN tbl T2
ON
T2.RowNum = T1.RowNum + 1

Galawij
دوشنبه 21 شهریور 1390, 18:19 عصر
دوست عزیز Reza_Yarahmadi (http://barnamenevis.org/member.php?97318-Reza_Yarahmadi)
چرا خروجی این دستورات منفیه؟؟

Reza_Yarahmadi
دوشنبه 21 شهریور 1390, 18:51 عصر
چرا خروجی این دستورات منفیه؟؟
جای StartDate و EndDate رو تغییر بدید درست میشه.
DateDiff(Day, T1.EndDate, T2.StartDate)

Galawij
دوشنبه 21 شهریور 1390, 19:11 عصر
Startdate, Enddate هر دو یک فیلد از یک جدول هستند.فرقی نمی کنه کدومش اول بیاد، کدومش آخر!
در حقیقت من از این دستور روی یک فیلد از یک جدول کار می کنم، ولی خروجی درست را با منفی نشان می دهد؟

Reza_Yarahmadi
چهارشنبه 23 شهریور 1390, 23:35 عصر
Startdate, Enddate هر دو یک فیلد از یک جدول هستند.فرقی نمی کنه کدومش اول بیاد، کدومش آخر!
در حقیقت من از این دستور روی یک فیلد از یک جدول کار می کنم، ولی خروجی درست را با منفی نشان می دهد؟
متوجه منظورتون نشدم!! تابع DateDiff دو تاریخ رو از هم کم میکنه ، توی تفریق هم اگر جای دو مقدار رو عوض کنید علامت نتیجه عوض میشه (یک منطق ساده ریاضی). مشکل جای دیگه است. ساختار جدول ، چند رکورد نمونه و دستوری که نوشتید رو بذارید تا بهتر بشه موضوع رو بررسی کرد.

Galawij
پنج شنبه 24 شهریور 1390, 09:58 صبح
سلام،

تابع DateDiff دو تاریخ رو از هم کم میکنه ، توی تفریق هم اگر جای دو مقدار رو عوض کنید علامت نتیجه عوض میشه (یک منطق ساده ریاضی).
من هم از همین تعجب می کنم،
این Query که طبق دستورات شما نوشتم:
With tbl as (Select *,Row_Number() Over(Order By IdDateReport) as RowNum From dbo.TbDateReport)
Select DateDiff(Day, T2.JulianDateReport, T1.JulianDateReport) as DateDiff From tbl T1 INNER JOIN tbl T2 ON T2.RowNum = T1.RowNum + 1این ساختار جدولم با داده های آن:
75324

و این هم نتیجه QUERY :
75325

Reza_Yarahmadi
پنج شنبه 24 شهریور 1390, 20:18 عصر
دستورتون رو بصورت زیر استفاده کنید درست میشه
With tbl as (
Select
*,
Row_Number() Over(Order By IdDateReport) as RowNum
From
TbDateReport
)
Select
DateDiff(Day, T1.JulianDateReport, T2.JulianDateReport) as DateDiff
From
tbl T1 INNER JOIN tbl T2
ON
T2.RowNum = T1.RowNum + 1

EBRAHIMIEKOKDARAGHI
سه شنبه 29 اردیبهشت 1394, 11:31 صبح
باسلام وتشکر از کد زیبای شما
اگه امکان داره کد معادل این کد رو در کوئری از نوع لینک تو ویژوال C# بزارید خیلی نیازه !!!

tooraj_azizi_1035
سه شنبه 29 اردیبهشت 1394, 14:10 عصر
سلام
بدون نیاز به Self Join می تونید با استفاده از LAG (از 2012 به بعد) بنویسید:

select DateDiff(Day, JulianDateReport, LAG(JulianDateReport, 1)) asDateDiff
from dbo.TbDateReport