如果日期是星期六或星期日,则SQL替换日期值

如果日期是星期六或星期日,则SQL替换日期值,sql,sql-server,tsql,Sql,Sql Server,Tsql,(对不起,我想不出更好的标题了) 我创建了以下select语句(SQL Server)作为视图 SELECT DISTINCT dbo.ECB.Currency + '-' + CAST(dbo.ECB.Date AS varchar(30)) AS ComboDate, dbo.ECB.Rate AS ECBrate FROM dbo.ECB INNER JOIN dbo.MyTable ON dbo.ECB.Dat

(对不起,我想不出更好的标题了)

我创建了以下select语句(SQL Server)作为视图

SELECT DISTINCT 
       dbo.ECB.Currency + '-' + 
           CAST(dbo.ECB.Date AS varchar(30)) AS ComboDate, 
       dbo.ECB.Rate AS ECBrate 
FROM 
    dbo.ECB 
INNER JOIN
    dbo.MyTable ON dbo.ECB.Date = dbo.MyTable.CutoffDate 
                AND dbo.ECB.Currency = dbo.MyTable.MyCurrency
我的问题:

我注意到的是,我的截止日期栏中有周六周日日期,但在
欧洲央行
日期栏中没有-这意味着我没有这些天的利率

由于我在Excel计算中使用了
截止日期
,因此我希望视图将周六和周日的日期值“替换”为周五

我找到了这个工作片段,并根据自己的需要对其进行了修改

SELECT 
    DISTINCT
    CASE WHEN DATEPART(weekday, dbo.CutoffDate) IN (6, 7) 
         THEN DATEADD(d, -((DATEPART(weekday, dbo.CutoffDate) + 1 + @@DATEFIRST) % 7), dbo.CutoffDate) 
         ELSE dbo.CutoffDate
    END
FROM
    MyTable
现在我需要找到一种方法来结合这两种结构,我希望你们能帮我解决这个问题

我想将第二条select语句添加到视图中,但没有成功


谢谢。

如果将您的
case
语句移动到join中,它应该可以工作

改变

dbo.MyTable ON dbo.ECB.Date = dbo.MyTable.CutoffDate


希望这能有所帮助。

看起来您已经找到了一种方法,它试图巧妙地调整日期,而不管会话的
DATEFIRST
设置如何-但是只有在天数为6或7时才调用它,这完全取决于
DATEFIRST
设置。简单性建议您为单个
DATEFIRST
设置编写代码,如果这是您所需要的,并且您知道它不是一个健壮的解决方案,您会感到很舒服。健壮性建议使整个表达式能够处理任何
DATEFIRST
设置。这不是问题。很高兴我能帮忙。你可以在连接中加入很多内容,
case
isnull
cast
,以及许多其他内容。我现在意识到,如果截止日期是周六或周日,我需要ECB.Date来使用截止日期。例如:如果截止日期=2012-02-17(星期日),则将ECB.日期也设置为2012-02-17,但使用上周五的ECB.日期的ECB.利率。否则,我的ComboDate字符串被设置为USD-2013-02-15,但在我的Excel中,截止日期的计算被设置为USD-2013-02-17,因此我再也没有ECB.利率。@SvenB我不确定我是否理解你的意思。是否仍在尝试使用相同的join语句进行连接,但更改select语句?听起来您想做的是将
案例
语句上移到您的select中,只使用
ECB.Date
而不是
截止日期
。很抱歉延迟-我还有其他事情要处理-当然,您上一次的评论是对的。我现在改了,效果很好。
dbo.Mytable ON dbo.ECB.Date = case when datepart(weekday, dbo.CutoffDate) IN (6,7) 
    then dateadd(d, -((datepart(weekday, dbo.CutoffDate) + 1 + @@DATEFIRST) % 7), dbo.CutoffDate) 
    else dbo.CutoffDate 
end