获取最新的星期五的SQL日期

时间:2011-05-13 21:42:36

标签: sql sql-server

我正试图在SQL Server 2008中获得最新的星期五。

我有这个。它会在一周的开始(星期一)然后减去3天才能到达星期五。

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

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

8 个答案:

答案 0 :(得分:14)

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

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

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

修改:已更新,可用于DATEFIRST

的任何设置

答案 1 :(得分:6)

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而得到的剩余部分将是自上周五以来经过的天数
  3. 从给定日期减去2.中的余数

答案 2 :(得分:4)

您可以检查当前星期几是星期五还是更大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

答案 3 :(得分:3)

使用已知的星期五日期(我将使用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 */

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

答案 4 :(得分:1)

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]

答案 5 :(得分:1)

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

这可用于查找前一天,方法是将“星期日”替换为您要查找的日期:

    DECLARE @myDate DATE = GETDATE()

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

答案 6 :(得分:0)

这是一个完全面向集合的方式来实现上周五:

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 :(得分:0)

这就是我希望得到的帮助

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