あなたの疑問を考えながら、私はカレンダーテーブルのアイデアを思いつきました。このコードを使用して、カレンダーに必要な日付の範囲を指定して、このコードを作成します。あなたに各部屋が占領されたそれぞれのユニークな日のための行を与える
select distinct t.House_id, c.date_id
from Reservation as r
inner join Calendar as c
on
c.date_id >= r.InitialDay
and c.date_id <= r.LastDay
:あなたはあなたのクエリが同じくらい簡単ですカレンダーのテーブルを作成したら、コードはhttp://blog.jontav.com/post/9380766884/calendar-tables-are-incredibly-useful-in-sql
declare @start_dt as date = '1/1/2010';
declare @end_dt as date = '1/1/2020';
declare @dates as table (
date_id date primary key,
date_year smallint,
date_month tinyint,
date_day tinyint,
weekday_id tinyint,
weekday_nm varchar(10),
month_nm varchar(10),
day_of_year smallint,
quarter_id tinyint,
first_day_of_month date,
last_day_of_month date,
start_dts datetime,
end_dts datetime
)
while @start_dt < @end_dt
begin
insert into @dates(
date_id, date_year, date_month, date_day,
weekday_id, weekday_nm, month_nm, day_of_year, quarter_id,
first_day_of_month, last_day_of_month,
start_dts, end_dts
)
values(
@start_dt, year(@start_dt), month(@start_dt), day(@start_dt),
datepart(weekday, @start_dt), datename(weekday, @start_dt), datename(month, @start_dt), datepart(dayofyear, @start_dt), datepart(quarter, @start_dt),
dateadd(day,-(day(@start_dt)-1),@start_dt), dateadd(day,-(day(dateadd(month,1,@start_dt))),dateadd(month,1,@start_dt)),
cast(@start_dt as datetime), dateadd(second,-1,cast(dateadd(day, 1, @start_dt) as datetime))
)
set @start_dt = dateadd(day, 1, @start_dt)
end
select *
into Calendar
from @dates
からです。あなたは、各部屋が占領された日数の合計が必要な場合には、次のようになります。
select a.House_id, count(a.House_id) as Days_occupied
from
(select distinct t.House_id, c.date_id
from so_test as t
inner join Calendar as c
on
c.date_id >= t.InitialDay
and c.date_id <= t.LastDay) as a
group by a.House_id
あなたはまた、 '1、2017年8月20日のようなレコードを持つことができ2017-08-22'、あなたはそれらの日は合計に追加したいと思います家1のために? –
ですから、出力はどうなりますか?ハウス1の5日間か...?他の列はありますか? – scsimon