获取日期+;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日)蓝色。请让我知道如果你我需要解释更多。