2017-04-05 14 views
1

找到週數我有兩個表 一個是查找表一週WeekNumberWeekdate如何查找表

enter image description here

,另一個是註冊

enter image description here

我想返回是從哪兒Entrytime是兩個日期

之間。例如落在周表當前WeekLabel:

  • Entrytime 2016-08-15 09:02:15.0000000
  • 是Weekstartdate價值2016-08-15 00:00:00.0002016-08-22 00:00:00.000之間
  • 所以我想返回WeekLabel 1和WeekStartdate 2016年8月15日從周表等..

回答

3

使用cross apply()獲得所發生的最新WeekStartDate之前或EntryTime

select r.* 
    , x.WeekLabel 
from register r 
    cross apply (
    select top 1 w.WeekLabel 
    from [Week] w 
    where w.weekstartdate =< r.entrytime 
    order by w.weekstartdate desc 
    ) as x 

開關outer apply()left join的功能性,例如如果沒有相應的WeekLabel,則返回null

2

您可以根據entrytime大於weekstartdate加入表格;這將使前幾周的每個條目都成倍增加,因此您可以通過WeekLabel獲得最新的max(假設它們不斷增加)。

select t2.ID, t2.CODE, max(t1.WeekLabel) 
from Week t1 
join Register t2 
on  t2.Entrytime > t1.Weekstartdate 
group by t2.ID, t2.CODE 
0

另一種選擇是使用datediff功能加入到本週參考表:

SELECT * from 
register r 
join [Week] w on 
    DATEDIFF(day, r.entryTime, w.weekStartDate) between 0 and 7 
1

另一種選擇是一個簡單的JOIN

Select R.* 
     ,W.WeekLabel 
     ,W.WeekStartdate 
From Register R 
Join [Week] W 
    on R.EntryTime >= W.WeekStartDate 
    and R.EntryTime < DateAdd(DAY,7,W.WeekStartDate) 
+0

可愛簡單的辦法,但不應' DATEADD(DAY,8 ...'read'DATEADD(DAY,7 ...'?例子:2016-08-15 + 7 = 2016-08-22。這兩個都是星期一。 –

+0

@ destination-data corrected。 ..我正在推翻它。謝謝f或者趕上 –

+0

我們都會去的!好的方法,避免使用相關的子查詢或不必要的聚合。 –