【问题标题】:SQL replace date values if date is Saturday or Sunday如果日期是星期六或星期日,SQL 替换日期值
【发布时间】:2013-02-20 14:09:06
【问题描述】:

(抱歉,我想不出更好的标题)

我创建了以下选择语句 (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

我的问题:

我注意到我的 CutoffDate 列中有 SaturdaySunday 日期,但 ECB 日期列中没有- 意思是我没有那些日子的费率。

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

我发现了这个有效的 sn-p 并根据我的需要对其进行了修改。

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 语句添加到我的视图中,但没有这样做。

谢谢。

【问题讨论】:

  • 看起来你有一种方法试图巧妙地调整日期,而不管会话的 DATEFIRST 设置如何 - 但只有当天数为 6 或7,这完全取决于DATEFIRST 设置。 Simplicity 建议您为单个 DATEFIRST 设置编码,如果这就是您所需要的,并且您知道这不是一个强大的解决方案。稳健性建议使整个表达式能够处理任何DATEFIRST 设置。

标签: sql sql-server tsql


【解决方案1】:

如果您将 case 语句移动到连接中,它应该可以工作。

改变

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

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

希望这会有所帮助。

【讨论】:

  • 没问题。很高兴我能提供帮助。你可以在 join 中加入很多东西,caseisnullcast 等等。
  • 我现在意识到,如果 CutoffDate 是周六或周日,我需要 ECB.Date 才能使用 CutoffDate。例如:如果 CutoffDate = 2012-02-17(星期日),则将 ECB.Date 也设置为 2012-02-17,但使用上一个星期五的 ECB.Date 的 ECB.Rate。否则,我的 ComboDate 字符串设置为 USD-2013-02-15,但在我的 Excel 中,CutoffDate 的计算设置为 USD-2013-02-17,然后我就没有 ECB.Rate 了。
  • @SvenB 我不确定我明白你在说什么。您是否仍在尝试使用相同的 join 语句加入,但更改了您的 select 语句?听起来您想要做的是将case 语句向上移动到您的选择中,仅使用ECB.Date 而不是CutoffDate
  • 抱歉耽搁了——我还有其他事情要处理——当然,你最后的评论是对的。我现在改变了它,它工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多