PDA

View Full Version : سوال: دريافت تاريخ هاي خالي



smakhavan
جمعه 29 مرداد 1389, 09:44 صبح
سلام من يك جدول دارم كه فيلدهاي آن تاريخ شروع و تاريخ پايان ميباشد مثلا
1388/01/01 - 1388/04/01
1388/04/15 - 1388/07/17
1388/07/18 - 1389/07/01
1389/08/01 - 1389/12/29

اين تاريخ ها در بعضي از مقاطع خالي هستند چطور ميتوانم آنها را بدست بياورم؟

يعني:
1388/04/02- 1388/04/14
1389/07/02- 1389/07/30

pezhvakco
جمعه 29 مرداد 1389, 10:35 صبح
درود :
اگه درست فهمیده باشم، جدول شما دو ستون داره برای تاریخ حالا می خوای ردیف هایی که ستون تاریخ خالیه رو بدست بیاری >

SELECT * FROM Table1
WHERE (tarikh1 IS NULL) and (tarikh2 IS NULL)


اين تاريخ ها در بعضي از مقاطع خالي هستند چطور ميتوانم آنها را بدست بياورم؟

يعني:
1388/04/02- 1388/04/14
1389/07/02- 1389/07/30
این یعنی ، یعنی چی ؟

بدرود.

smakhavan
شنبه 30 مرداد 1389, 09:57 صبح
نه اشتباه متوجه شديد، البته شايد من خيلي بد گفتم

جدول من دو ستون داره يكي تاريخ شروع و يكي تاريخ پايان
حالا اگه اين تاريخ شروع و پايان را بياريم روي يك محور زمان ميبينيم كه تمامي زمانها را پر نميكنه. يعني شروع يكي با پايان يكي ديگه الزاما برابر نيست.

مثالا اگه اين تاريخ شروع و پايان، تاريخ شروع به كار و پايان كار يك فرد باشه من ميخواهم بازه زمانهايي كه فرد مشغول به كار نبوده را به دست بياورم درست مثل مثال بالا

az.heidarzadeh
شنبه 30 مرداد 1389, 10:07 صبح
خب شما حتما تاریخ ها رو بصوت string ذخیره میکنید و اینطوری نمیتونید بازه تاریخ بین دوتا تاریخ رو دربیارید فکر کنم حتما باید نوعش datetime باشه اینطوری خیلی راحت مشه بدستش آورد ، البته اونطوری هم میتونید انجامش بدید ها ولی خب باید کدش رو بنویسید دیگه مثلا یک کلاس بنویسید که اینکارو براتون انجام بده ...

smakhavan
شنبه 30 مرداد 1389, 12:28 عصر
خب شما حتما تاریخ ها رو بصوت string ذخیره میکنید و اینطوری نمیتونید بازه تاریخ بین دوتا تاریخ رو دربیارید فکر کنم حتما باید نوعش datetime باشه اینطوری خیلی راحت مشه بدستش آورد ، البته اونطوری هم میتونید انجامش بدید ها ولی خب باید کدش رو بنویسید دیگه مثلا یک کلاس بنویسید که اینکارو براتون انجام بده ...

تبديل كردن رشته به datetime كاري نداره و كدش در اين تالار موجوده. شما فرض را بگذاريد بر اينكه تاريخ ها به صورت datetime و ميلادي ذخيره شده.
من هم اون قسمتي كه به قول شما ميشه خيلي راحت بدست آورد را ميخوام.
يه كوئري ميخوام كه ورودي و خروجي اش مثل بالا باشه.

m_omrani
شنبه 30 مرداد 1389, 16:26 عصر
با استفاده از اسکریپت زیر می توانيد اين کار را انجام بدهيد.



declare @i int
declare @j int
declare @mindate varchar(10)
declare @maxdate varchar(10)
declare @date varchar(10)
declare @x table(workdate varchar(10))
declare @mytable table(mypk int identity,startdate varchar(10),enddate varchar(10))

set @mindate = '1389/04/01'
set @maxdate = '1389/04/31'

insert into @mytable(startdate,enddate) values('1389/04/01','1389/04/03')
insert into @mytable(startdate,enddate) values('1389/04/06','1389/04/12')
insert into @mytable(startdate,enddate) values('1389/04/14','1389/04/20')
insert into @mytable(startdate,enddate) values('1389/04/25','1389/04/31')

set @i = 1
while @i<=31
begin
set @j = 1
while @j <=12
begin
set @date='1389/'+right('0'+cast(@j as varchar(10)),2)+'/'+right('0'+cast(@i as varchar(10)),2)
if @date>=@mindate and @date <= @maxdate
insert into @x(workdate) values(@date)
set @j = @j + 1
end
set @i = @i + 1
end

select
t.*,
(select MIN(workdate) from @x where workdate not between t.startdate and t.enddate and workdate>t.startdate) as startdate1,
(select max(workdate) from @x where workdate not between t.startdate and t.enddate and workdate<(select min(startdate) from @mytable where startdate > t.startdate)) as enddate1
from @mytable t order by t.startdate,t.enddate
نتيجه اجراي اسکريپت بالا چنين است:


1 1389/04/01 1389/04/03 1389/04/04 1389/04/05
2 1389/04/06 1389/04/12 1389/04/13 1389/04/13
3 1389/04/14 1389/04/20 1389/04/21 1389/04/24
4 1389/04/25 1389/04/31 NULL NULL