获取日期+ 3天(使用特定日期)SQL

时间:2018-06-22 14:04:12

标签: sql sql-server tsql

我正在尝试获取结果集后的第二天。

这是我正在使用的查询,但完全错误:

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表

enter image description here

WorkDay_Calendar Table

enter image description here

请注意,当Sentday和RecDay有效时,如果1无效(因为周末或假日),则= 0。

例如,基于此信息,如果我从Dim_Date表2018-02-02中选择Closingdate之一,则RecDay应为:

DateID       RecDay
------------------------
1            2018-02-07

使用当前查询正在检索此消息,这是完全错误的:

DateID       RecDay
-----------------------
1            2018-02-05

下面的图形说明,请遵循加粗的0:

enter image description here

更多输出示例: 使用以下日期作为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

2 个答案:

答案 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