拉上周五的约会

时间:2014-02-14 13:40:14

标签: sql sql-server

我有这个查询在给定日期的情况下拉出最后一个星期五日期。除非给定的日期是今天,否则它可以全天使用。

  

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

以p为例,今天是2014-02-14。如果我申请上述查询,返回的结果仍然是2014-02-14

  

dateadd(d, - ((datepart(工作日,'2014-02-14')+ 1 + @@ DATEFIRST)%7),   '2014年2月14日')

如果我把2014-02-13放在下面,那么它会在上个星期五正确返回。

  

选择dateadd(d, - ((datepart(工作日,'2014-02-13')+ 1 +   @@ DATEFIRST)%7),'2014-02-13')

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

3 个答案:

答案 0 :(得分:6)

您可以查看当天是星期五是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'

答案 1 :(得分:3)

蛮力方法怎么样:

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()引用替换为另一个日期的其他日期。

答案 2 :(得分:2)

你的第一次尝试似乎非常接近,我认为你只需要将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;

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

如果您可以控制日期优先设置,则会变得更简单:

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

但是我总是建议您的查询对本地设置安全。