我正在尝试获取结果集后的第二天。
这是我正在使用的查询,但完全错误:
SELECT DateID = ROW_NUMBER() over (order by B.Date_Key) , B.ClosingDate, C.dates AS RecDay
FROM DIM_DATE B JOIN [dbo].[WorkDay_Calendar] C on C.dates = DATEADD(DAY,3, B.ClosingDate) WHERE YEAR(B.ClosingDate) >= '2018'
AND C.[Sentday] = 0 and C.[RecDay] = 0
此查询是
截止日期+3天=到星期天时检索RecDay并且我想要的是
当Closingdate + 3(Sentday)然后选择下一个RecDay,
类似于C.dates = DATEADD(DAY,3(Sentday), B.ClosingDate)
。
这是我的桌子的样子:
Dim_Date表
WorkDay_Calendar Table
请注意,当Sentday和RecDay有效时,如果1无效(因为周末或假日),则= 0。
例如,基于此信息,如果我从Dim_Date表2018-02-02中选择Closingdate之一,则RecDay应为:
DateID RecDay
------------------------
1 2018-02-07
使用当前查询正在检索此消息,这是完全错误的:
DateID RecDay
-----------------------
1 2018-02-05
下面的图形说明,请遵循加粗的0:
更多输出示例: 使用以下日期作为ClosingDate:
Date_Key ClosingDate:
38284 2018-07-24
38287 2018-01-10
38290 2018-03-08
38291 2018-07-13
38293 2018-02-08
使用ClosingDate的相同顺序,这些应该是输出,我将ClosingDate列包括在内,以便您可以遵循以下顺序: 输出:
DateID ClosingDate RecDay (output)
1 2018-07-24 2018-07-30
2 2018-01-10 2018-01-16
3 2018-03-08 2018-03-13
4 2018-07-13 2018-07-18
5 2018-02-08 2018-02-13
答案 0 :(得分:2)
我不确定是否正确地遵循了您的说明,但是根据您的情况,您是否要根据日历表检查日期维度表。如果ClosingDate + 3天等于SentDay,则需要获取ReceiveDay。如果那是您的需要。然后尝试一下:
已更新
SELECT
ROW_NUMBER() OVER (ORDER BY Date_key) DateID,
ClosingDateOLD,
C.Dates
FROM (
SELECT
Date_key,
ClosingDate AS ClosingDateOLD,
CASE
WHEN DATENAME(dw, DATEADD(DAY, 4, ClosingDate)) IN ('Saturday') THEN DATEADD(DAY, 6, ClosingDate)
WHEN DATENAME(dw, DATEADD(DAY, 4, ClosingDate)) IN ('Sunday') THEN DATEADD(DAY, 5, ClosingDate)
ELSE DATEADD(DAY, 5, ClosingDate)
END AS ClosingDate
FROM
@DIM_DATE
WHERE
ClosingDate IS NOT NULL
) D
JOIN @Calendar C ON C.Dates = ClosingDate
答案 1 :(得分:1)
据我了解的要求,可能是这样的。
我正在发布一个完整的工作示例,以防有人想要对此进行破解。
create table #DIM_DATE
(
DateKey int
, ClosingDate date
)
insert #DIM_DATE values
(1, NULL)
, (2, '2018-01-02')
, (3, NULL)
, (4, NULL)
create table #CalendarTable
(
ID int
, SentDay date
, ReceiveDay date
)
insert #CalendarTable values
(1, '2018-01-03', '2018-01-02')
, (2, '2018-01-04', '2018-01-03')
, (3, '2018-01-05', '2018-01-08')
SELECT DateID = ROW_NUMBER() over (order by d.DateKey)
, ct.ReceiveDay
FROM #DIM_DATE d
join #CalendarTable ct on ct.SentDay = dateadd(day, 3, d.ClosingDate)
drop table #DIM_DATE
drop table #CalendarTable