Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取日期+;3天(使用特定日期)SQL_Sql_Sql Server_Tsql - Fatal编程技术网

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

获取日期+;3天(使用特定日期)SQL,sql,sql-server,tsql,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.Closin

我正在尝试在结果集之后的下一天获得可用的数据

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

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
DateID       RecDay
-----------------------
1            2018-02-05
此查询是 在Closingdate+3天=到Sentday时检索RecDay,我想要的是 当结束日期+3(Sentday)时,选择下一天, 类似于
C.dates=DATEADD(DAY,3(Sentday),B.ClosingDate)

以下是您如何查看我的表格:

Dim_日期表

工作日日历表

请注意,如果1因为是周末或假日而无效,则when Sentday和RecDay在=0时有效

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

DateID       RecDay
------------------------
1            2018-02-07
当前查询检索的是完全错误的:

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
DateID       RecDay
-----------------------
1            2018-02-05
下面是图形说明,请按照粗体显示的0进行操作:

更多输出示例: 使用以下日期作为结束日期:

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列,因此您可以按照以下顺序操作: 产出:


我不确定是否正确地跟踪了您,但根据您的情况,您希望检查基于日历表的日期维度表。如果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

我不确定是否正确地跟踪了您,但根据您的情况,您希望检查基于日历表的日期维度表。如果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

据我所知,要求是这样的

我张贴了一个完整的工作示例,以防有人想尝试一下

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

据我所知,要求是这样的

我张贴了一个完整的工作示例,以防有人想尝试一下

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


你能提供样本“输入”数据吗?不清楚你在用什么。它已经在那里了。不,它还没有在那里。您为列列出了一些值,这些值与表实际包含的值不同。请记住,我们不知道您的表格,也不知道您在这里想要完成什么。你需要发布一些东西,以便其他人可以帮助你。这是一个很好的起点。好的,现在编辑了表格描述,请告诉我这是否有帮助。那么接收日期是发送前的5天?老实说,我真的不明白你在这里想做什么。你能提供样本“输入”数据吗?不清楚你在用什么。它已经在那里了。不,它还没有在那里。您为列列出了一些值,这些值与表实际包含的值不同。请记住,我们不知道您的表格,也不知道您在这里想要完成什么。你需要发布一些东西,以便其他人可以帮助你。这是一个很好的起点。好的,现在编辑了表格描述,请告诉我这是否有帮助。那么接收日期是发送前的5天?老实说,我真的不明白你想在这里做什么。哈哈,就在我的代码发布几秒钟之前,我发布了几乎相同的代码。:)@你相信心灵感应吗?:)我可能得开始相信了@JCACERES将此添加到join
和DATENAME(dw,ClosingDate)NOT IN('Friday','Saturday')
看看这是不是你想要的。我刚刚做了一些编辑,如果你知道你现在是否能理解,请告诉我。哈哈,在我之前几秒钟发布了几乎相同的代码。:)@你相信心灵感应吗?:)我可能得开始相信了@JCACERES将此添加到join
和DATENAME(dw,ClosingDate)NOT IN('Friday','Saturday')
看看是否是您想要的。我刚刚做了一些编辑,如果您现在能理解,请告诉我。您需要详细说明“仍然无法工作”。问题是什么?似乎计数是基于任何一天,但我真正想要的是计数(SentDay),意思是结束日期+3 SentDay。这里没有计数。也许你应该分享一些不正确的细节。现在还不清楚你想要什么作为输出,我只是做了一个有根据的猜测。似乎这不是很正确,但不确定会是什么。我真的不想采取更多的样本数据,并将其转换为我可以使用的东西,以便我可以回答一个一直缺乏清晰度的问题(显然在多个网站上)。您所说的所需输出正是此处返回的结果。显然有些逻辑你没有解释。好吧,正如你在我添加的图片中所看到的,如果关闭日期为2018年1月2日黄色,那么数到接下来的3天(SentDay=0)橙色一天是SentDay,然后选择下一个ReceiveDay=0(2018年1月8日)蓝色。如果你需要我解释的话,请告诉我。您需要详细说明“仍然无法工作”。问题是什么?似乎计数是基于任何一天,但我真正想要的是计数(SentDay),意思是结束日期+3 SentDay。这里没有计数。也许你应该分享一些不正确的细节。现在还不清楚你想要什么作为输出,我只是做了一个有根据的猜测。似乎这不是很正确,但不确定会是什么。我真的不想采取更多的样本数据,并将其转换为我可以使用的东西,以便我可以回答一个一直缺乏清晰度的问题(显然在多个网站上)。您所说的所需输出正是此处返回的结果。显然有些逻辑你没有解释。好吧,正如你在我添加的图片中所看到的,如果关闭日期为2018年1月2日黄色,那么数到接下来的3天(SentDay=0)橙色一天是SentDay,然后选择下一个ReceiveDay=0(2018年1月8日)蓝色。请让我知道如果你我需要解释更多。