ورود

View Full Version : سوال: ایجاد تابعی که همزمان دو رکورد را بخواند



fa_karoon
شنبه 20 آذر 1389, 09:44 صبح
سلام دوستان می خواهم تابعی بنویسم که ابتدا یک Select کند بعد به رکورد بعدی برود و باز Select بگیرد در نهایت جواب این دو Select را می خواهم در متغیرهای جدا بریزم ایا دستوری هست که پس از Select اول اشاره گر را به رکورد بعدی در همان جدول ببرد؟

حمیدرضاصادقیان
شنبه 20 آذر 1389, 09:57 صبح
شما میخواهید دقیقا چه کاری انجام بدید؟ آیا محاسبات خاصی میخواهید انجام بدید؟
اگر میتونید با مثال توضیح بدید.

fa_karoon
شنبه 20 آذر 1389, 10:29 صبح
می خوام End Date رکورد اول رو بخونم بریزم تو یه متغیر بعد یه رکورد جلو بره Start Date رکورد بعد رو بخونم و باز بریزم تو یه متغیر اون وقت یه تابع دیگه رو صدا کنم و این دو متغیر رو به عنوان ورودی به اون بدم

قرار است با استفاده از این کار فاصله EndDate یک رکورد تا Start Date رکورد بعد را بیابم

Rezahak
شنبه 20 آذر 1389, 11:46 صبح
فکر می کنم تنها راه استفاده از cursor باشه . اگه طرز استفاده اش را بلد نیستی بگو توضیح بدم....

fa_karoon
شنبه 20 آذر 1389, 11:56 صبح
فکر می کنم تنها راه استفاده از cursor باشه . اگه طرز استفاده اش را بلد نیستی بگو توضیح بدم....

قبلا از cursor استفاده کردم خودم هم فکر می کنم با این باید پیاده اش کنم اما مگه نه کرسر تا پایان تمام رکوردها جلو میره ؟ من فقط می خوام وقتی داره یه رکوردی رو می خونه همون رکورد و رکورد بعدش رو بخونه

Rezahak
شنبه 20 آذر 1389, 11:59 صبح
خب عزیزم یک متغیر تعریف کن که هر وقت 2 شد از حلقه بیاد بیرون!!!!!
البته می دونی که باید این کارت رو توی یک function یا sp انجام بدی که؟؟؟؟

mbasirati
شنبه 20 آذر 1389, 22:09 عصر
خب عزیزم یک متغیر تعریف کن که هر وقت 2 شد از حلقه بیاد بیرون!!!!!

با کمال احترام برای جناب rezahak
من فکر میکنم نیاز به حلقه نیست ، فقط دوبار از fetch next‌ استفاده کنه کافیه ، چون میخواد تو دو تا متغیر بریزه

Rezahak
شنبه 20 آذر 1389, 22:44 عصر
با کمال احترام برای جناب rezahak
من فکر میکنم نیاز به حلقه نیست ، فقط دوبار از fetch next‌ استفاده کنه کافیه ، چون میخواد تو دو تا متغیر بریزه
دوست عزیز شما به انجام دادن یک کار تکراری بیش از یک بار مثل دوبار استفاده از fetch next چی می گید؟؟؟؟

mbasirati
شنبه 20 آذر 1389, 23:19 عصر
دوست عزیز شما به انجام دادن یک کار تکراری بیش از یک بار مثل دوبار استفاده از fetch next چی می گید؟؟؟؟

درسته حق باشماست ، ولی شما چه جوری میتونید تو یه حلقه دوتا متغیر مختلف رو مقدار دهی کنید؟ این کار امکان پذیره؟ایشون میخواد دوتا متغیر رو مقدار دهی کنه

Rezahak
شنبه 20 آذر 1389, 23:36 عصر
دوباره سئوال را بخون : راجع به دوتا متغیر که مشکل نداریم یک متغیر اضافی به عنوان شمارنده حلقه می گیریم که اگر یک بود یعنی نوبت Enddate است و اگر 2 بود یعنی نوبت Startdate اگر هم بزرگتر از 2 بود یعنی از حلقه برو بیرون

mbasirati
شنبه 20 آذر 1389, 23:55 عصر
دوباره سئوال را بخون : راجع به دوتا متغیر که مشکل نداریم یک متغیر اضافی به عنوان شمارنده حلقه می گیریم که اگر یک بود یعنی نوبت Enddate است و اگر 2 بود یعنی نوبت Startdate اگر هم بزرگتر از 2 بود یعنی از حلقه برو بیرون

ببخشید جواب میدم (شما استادی و من شاگرد)
ولی با این راه شما چند کار اضافه داره انجام میشه ، وجود یه متغیر سوم ، وجود یه حلقه و چندین if ، درحالی که هیچ نیازی به اینها نیست

حمیدرضاصادقیان
یک شنبه 21 آذر 1389, 07:56 صبح
می خوام End Date رکورد اول رو بخونم بریزم تو یه متغیر بعد یه رکورد جلو بره Start Date رکورد بعد رو بخونم و باز بریزم تو یه متغیر اون وقت یه تابع دیگه رو صدا کنم و این دو متغیر رو به عنوان ورودی به اون بدم

قرار است با استفاده از این کار فاصله EndDate یک رکورد تا Start Date رکورد بعد را بیابم

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

fa_karoon
یک شنبه 21 آذر 1389, 09:31 صبح
شما میخواهید اینکار رو روی کل اطلاعات جدول انجام بدید؟ یا فقط میخواهید روی دوتا رکورد انجام بدید.؟
میتونید یک نمونه از اطلاعات رو اینجا قرار بدید؟
از چه نسخه ای استفاده میکنید؟

ابتدا از پاسخ و تلاش همه دوستان ممنونم، تمام رکوردهایی که EqiID شون برابر مقدار خاصی هست باید این کار براشون انجام بشه،
به عنوان مثال
ID EqiID StartDate EndDate
1 15 1389/08/01 1389/08/05
2 15 1389/08/06 1389/08/12

از SQL Express2005 استفاده می کنم

حمیدرضاصادقیان
یک شنبه 21 آذر 1389, 09:52 صبح
ابتدا از پاسخ و تلاش همه دوستان ممنونم، تمام رکوردهایی که EqiID شون برابر مقدار خاصی هست باید این کار براشون انجام بشه،
به عنوان مثال
ID EqiID StartDate EndDate
1 15 1389/08/01 1389/08/05
2 15 1389/08/06 1389/08/12


از SQL Express2005 استفاده می کنم
یعنی الان باید 1389/08/01 رو از 1389/08/12 کم کنه و اختلافش که 11 روز هست رو بگه؟

fa_karoon
یک شنبه 21 آذر 1389, 11:07 صبح
یعنی الان باید 1389/08/01 رو از 1389/08/12 کم کنه و اختلافش که 11 روز هست رو بگه؟

نه برعکس الان باید اختلاف بین 1389/08/05 و 1389/08/06 به دست بیاد که می شه 1 روز بعد من این رو به ساعت و دقیقه تبدیل می کنم

tooraj_azizi_1035
یک شنبه 21 آذر 1389, 11:17 صبح
سلام،
select a.iD, a.StDate, a.EndDate, b.ID, d.StDate, b.EndDate, DATEDIFF(d,b.EndDate,a.StDate) as DtDiff
from YourTable a
join YourTable b
on b.ID = a.ID-1

به جای DATEDIFF باید تابعی خودتان بنویسید که دوتاریخ شمسی رو از هم کم کنه و مقدار رو برگردونه.
YourTable جدول شماست.

Reza_Yarahmadi
یک شنبه 21 آذر 1389, 11:54 صبح
براي اين مورد نيازي به استفاده از كرسر نيست ، ميشه با دستوري مثل دستور زير هم به نتيجه مورد نظر رسيد.

With tbl as(
Select
Row_Number() OVER(ORDER BY StartDate) as ID2
,StartDate
,EndDate
,ID
From
TableName
)
Select
t2.*,
t1.StartDate - t2.EndDate as Difference
From
tbl t1 inner join tbl t2
On
t1.Id2 = t2.Id2 + 1