【问题标题】:Get the most recent Friday's date SQL获取最近周五的日期 SQL
【发布时间】:2020-09-10 15:18:39
【问题描述】:

我正在尝试获取 SQL Server 2008 中最近的星期五。

我有这个。它获取一周的开始(星期一),然后减去 3 天得到星期五。

declare @recentFriday datetime =  DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3

当它在一周内运行时,它会得到上周五的正确日期。但是在星期五(或星期六)运行时,它仍然获得上周的日期而不是本周的星期五。我即将使用 if/else 条件,但我确信有更简单的方法。

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这适用于DATEFIRST 的任何输入和任何设置:

dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate())

它的工作原理是调整工作日值,使 0 = 星期五,模拟星期五作为一周的开始。然后减去非零的工作日值以获得最近的星期五。

编辑:更新后适用于DATEFIRST 的任何设置。

【讨论】:

  • 我没有投反对票,但我认为在您编辑问题之前投反对票。
  • 嗨@mellamokb,我对你发布的这行代码很感兴趣。我有一个场景,我可能必须使用它,以便在一个脚本中我可能必须找到最近的星期四,或者在另一个脚本中找到最近的星期一。我必须在您的代码中进行哪些更改才能拥有那种级别的灵活性?例如,我是否只需将“+1”更改为“+2”以获取最近的星期四?您的代码如何使 Friday = 0?
  • 它的中间值(+1)这是一个更通用的版本,其中包含一些您可以使用的测试变量,希望能说明:DECLARE @DayToFind varchar(10), @DwValue int, @DateToTestWith datetime; SELECT @DayToFind = 'fri', @DateToTestWith = DATEADD(dd, 0, GetDate()); SELECT @DwValue = CHARINDEX(SUBSTRING(@DayToFind,1,3), 'FRITHUWEDTUEMONSUNSAT') / 3 + 1; SELECT dateadd(d, -((datepart(weekday, @DateToTestWith) + @DwValue + @@DATEFIRST) % 7), @DateToTestWith); 尝试更改 @DayToFind 或@DateToTestWith。
  • 我终其一生都无法弄清楚@@DATEFIRST 应该是什么。是数字吗?一个约会?什么日期?
  • @Martha:查看文档here,应该会回答您所有的问题。如果某些 SQL Server 实例具有自定义一周的第一天,则必须这样做。
【解决方案2】:
DECLARE @date DATETIME = '20110512' -- Thursday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110506

SET @date = '20110513' -- Friday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513

SET @date = '20110514' -- Saturday
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513
  1. 计算已知星期五(1900 年 1 月 5 日)与给定日期之间的天数
  2. 将差值除以 1. 除以 7 的余数将是自上周五以来经过的天数
  3. 从给定日期减去 2. 中的余数

【讨论】:

    【解决方案3】:

    您可以检查当前星期几是否为星期五或更大DATEPART(dw,GETDATE()),然后致电(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4)(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3)

    SELECT 
    CASE WHEN DATEPART(dw,GETDATE()) >= 5 THEN 
    (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) 
    ELSE 
    (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3) 
    END
    

    【讨论】:

    • 这取决于@@DATEFIRST 设置。如果我尝试SET DATEFIRST 2,它会返回2011-05-06,对于SET DATEFIRST 1,它会返回2011-05-13
    • @Martin,我同意你的观点,但是 OP 可以轻松地将该变量添加到建议的 SQL 中。
    【解决方案4】:

    使用已知的星期五日期(我将使用 2011 年 1 月 7 日)作为起点,您可以这样做:

    DECLARE @d DATETIME
    
    SET @d = '2011-05-13' /* Friday */
    SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
    /* Returns 2011-05-13 */
    
    SET @d = '2011-05-12' /* Thursday */
    SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d) / 7) * 7, '20110107')
    /* Returns 2011-05-06 */
    

    只需选择一个比您将在计算中使用的任何日期都早的已知星期五。

    【讨论】:

      【解决方案5】:
      SELECT CONVERT(VARCHAR(12),GETDATE()) AS Today,
      CASE WHEN (DATEPART(DW,GETDATE())< 7) 
      THEN CONVERT(VARCHAR(12),(DATEADD(dd,-(DATEPART(DW,GETDATE())+1),GETDATE())))
      ELSE CONVERT(VARCHAR(12),(DATEADD(d,- 1,GETDATE())))
      END AS [Last Friday]
      

      【讨论】:

        【解决方案6】:

        这是完成上周五的完全以集合为导向的方法:

        select Friday from
        (
        select max(GetDate()) as Friday where datepart(dw, getdate()) = 6
        union all
        select max((GetDate() - 1)) where datepart(dw, (getdate() - 1)) = 6
        union all
        select max((GetDate() - 2)) where datepart(dw, (getdate() - 2)) = 6
        union all
        select max((GetDate() - 3)) where datepart(dw, (getdate() - 3)) = 6
        union all
        select max((GetDate() - 4)) where datepart(dw, (getdate() - 4)) = 6
        union all
        select max((GetDate() - 5)) where datepart(dw, (getdate() - 5)) = 6
        ) x where Friday is not null
        

        【讨论】:

          【解决方案7】:

          其他解决方案不适用于我的用例。

          这适用于通过将“星期日”替换为您要查找的日期来查找任何前一天:

              DECLARE @myDate DATE = GETDATE()
          
              WHILE DATENAME(WEEKDAY, @myDate) <> 'Sunday'
              BEGIN
                  SET @myDate = DATEADD(DAY, -1, @myDate)
              END
          

          【讨论】:

            【解决方案8】:

            这是我得到的,希望对你有帮助

            DECLARE @UserDate DateTime
            SET @UserDate = '2020-09-03'
            SELECT DATEADD(day, (6 - datepart(weekday, @UserDate)) , @UserDate)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-05-12
              • 2012-08-08
              • 1970-01-01
              • 2017-09-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多