【问题标题】:To pull last friday date拉上周五的日期
【发布时间】:2014-03-13 21:45:25
【问题描述】:

我有这个查询来提取给定日期的最后一个星期五日期。它适用于一整天,除非给定日期是今天。

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

例如,今天是 2014-02-14。如果我应用上面的查询,返回的结果仍然是 2014-02-14

dateadd(d, -((datepart(weekday, '2014-02-14') + 1 + @@DATEFIRST) % 7), '2014-02-14')

如果我在下面输入 2014-02-13,那么它会正确返回上周五的日期。

select dateadd(d, -((datepart(weekday, '2014-02-13') + 1 + @@DATEFIRST) % 7), '2014-02-13')

如果今天是星期五,你能帮助我如何获得上周五的日期。

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    你可以用DATENAME查看今天是否是星期五,如果是,则减去7天,否则,使用你制作的函数

    SELECT CASE WHEN DATENAME(WEEKDAY, GETDATE()) = 'Friday' THEN
            CONVERT(DATE, DATEADD(DAY, -7, GETDATE()))
        ELSE
            DATEADD(d, -((DATEPART(WEEKDAY, GETDATE()) + 1 + @@DATEFIRST) % 7), GETDATE())
        END AS 'LastFriday'
    

    【讨论】:

    • 如果语言设置不是英语怎么办?此外,使用 string literals as column aliases 已被弃用。在任何新代码中都应该避免这种情况。
    • 感谢您的文章。像其中的许多 cmets 一样,我一直在做 AS vs =。这将是一个很难改掉的习惯。
    • 没问题,我认为 alias = column 而不是 column AS alias 完全是个人喜好,我绝不会试图强迫任何人使用其中一个,但这是我能写的最清晰的文章发现确认 column AS 'alias' 已弃用。它位于deprecated list 的页面下方,所以我不会立即清楚我为什么要链接它。
    【解决方案2】:

    蛮力方法怎么样:

    select dateadd(day,
                   (case when datename(weekday, getdate()) = 'Friday' then -7
                         when datename(weekday, getdate()) = 'Saturday' then -1
                         when datename(weekday, getdate()) = 'Sunday' then -2
                         when datename(weekday, getdate()) = 'Monday' then -3
                         when datename(weekday, getdate()) = 'Tuesday' then -4
                         when datename(weekday, getdate()) = 'Wednesday' then -5
                         when datename(weekday, getdate()) = 'Thursday' then -6
                    end),
                   cast(getdate() as date)
                  );
    

    这就是今天的逻辑。您可以将所有getdate() 引用替换为另一个日期的另一个日期。

    【讨论】:

      【解决方案3】:

      您的第一次尝试似乎非常接近,我认为您只需将 1 移到模函数之外。这对我有用:

      SELECT  DATEADD(DAY, -1 - ((DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7), CAST(GETDATE() AS DATE));
      

      然后在更大的样本上测试它似乎仍然有效:

      DECLARE @T TABLE (DateFirst INT, Date DATE, LastFriday DATE)
      DECLARE @I INT = 1;
      WHILE @I < 8
          BEGIN
      
              SET DATEFIRST @i;
      
              WITH TestDates AS
              (   SELECT  Date = DATEADD(DAY, -Number, CAST(GETDATE() AS DATE))
                  FROM    master..spt_values 
                  WHERE   Type = 'P'
                  AND     Number BETWEEN 0 AND 20
              )
              INSERT @T (DateFirst, Date, lastFriday)
              SELECT  @I,
                      Date,
                      LastFriday = DATEADD(DAY, -1 - ((DATEPART(WEEKDAY, Date) + @@DATEFIRST) % 7), Date)
              FROM    TestDates;
      
              SET @i += 1;
      
          END
      
      SELECT  *
      FROM    @T
              PIVOT 
              (   MAX(LastFriday) 
                  FOR DateFirst IN ([1], [2], [3], [4], [5], [6], [7])
              ) pvt
      ORDER BY Date;
      

      这适用于所有语言和日期优先设置。

      如果您可以控制 datefirst 设置,这将变得更简单:

      SET DATEFIRST 6;
      SELECT  DATEADD(DAY, -DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE))
      

      但是,我始终建议您针对本地设置进行安全查询。

      【讨论】:

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