找到特定日期在T-Sql中“最接近”的星期五

时间:2010-03-01 18:12:31

标签: sql sql-server

我正在寻找一种优雅简单的方法来确定最接近特定日期的星期五的日期。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

这将返回将来最接近的星期五:

SELECT  DATEADD(day, 6 - (DATEDIFF(day, '01/01/2010', @mydate) - 1) % 7, @mydate)

答案 1 :(得分:2)

诀窍是确定离提供日期最近的星期五有多少天。为了提供帮助,请查看整周和距离最近的星期五的天数:

周日-2
星期一-3
星期二3 星期三2 星期四1 周五0
星期六-1

现在您需要一个公式来返回这些结果。因为星期日和星期一遵循与一周中其他日子不同的模式,所以需要两个公式。

首先,这是周日和周一的一个。它将星期几的值加1,然后将负数应用于添加日期。例如,星期一的默认值为星期几值。 (2 + 1)* -1 = -3。 -3 +星期一=星期五。

星期二 - 星期六使用类似的算术:日期返回星期值3,4,5,6和& 7.我们需要日期添加值分别为3,2,1,0,-1。得到这个的公式是DW * -1 + 6.

DECLARE @Date AS datetime
SET @Date = '3/1/2010'
SELECT
    CASE
        WHEN DATEPART(dw, @Date) <= 2
        THEN DATEADD(d, -1 * (DATEPART(dw, @Date) + 1), @Date)
        ELSE DATEADD(d, DATEPART(dw, @Date) * -1 + 6, @Date)
    END AS NearestFriday

答案 2 :(得分:1)

你必须在一周的开始时滑动(使用DATEFIRST),这样你就可以在星期二成为星期几,然后你只需要添加去往最近星期五的天数。

SET NOCOUNT ON
SET DATEFIRST 3

Declare @DateValue DateTime

SET @DateValue = '1/1/2010'

While @DateValue < '2/1/2011'
BEGIN
    PRINT DateAdd (Day, 3 - DatePart (dw, @DateValue), @DateValue)
    SET @DateValue = @DateValue + 1
END

答案 3 :(得分:0)

如果您需要找到最接近的(过去或将来的)星期五,请尝试:

DECLARE @StartDate datetime
       ,@EndDate   datetime
       ,@BeforeDate   datetime


SET @StartDate='2010-3-1'---<<<given date, Monday, closest should be '2010-2-26'
SET @EndDate=@StartDate+8
SET @BeforeDate=@StartDate-8
;with AllDates AS
(
    SELECT @StartDate AS DateOf, 1 as TypeOf,DATENAME(weekday,@StartDate) AS WeekDayOf, ABS(DATEDIFF(day,@StartDate,@StartDate)) AS DifferenceOf
    UNION ALL
    SELECT DateOf+1 AS DateOf,2 AS TypeOf,DATENAME(weekday,DateOf+1 ) AS WeekDayOf, ABS(DATEDIFF(day,@StartDate,DateOf+1)) AS DifferenceOf
        FROM AllDates
    WHERE DateOf<@EndDate-1 AND TypeOf IN (1,2)
    UNION ALL
    SELECT DateOf-1 AS DateOf,3 AS TypeOf,DATENAME(weekday,DateOf-1 ) AS WeekDayOf, ABS(DATEDIFF(day,@StartDate,DateOf-1)) AS DifferenceOf
        FROM AllDates
    WHERE DateOf>@BeforeDate-1 AND TypeOf IN (1,3)
)
SELECT TOP 1 DateOf
    FROM AllDates
    WHERE WeekDayOf='Friday'
    ORDER BY DifferenceOf

输出:

DateOf
-----------------------
2010-02-26 00:00:00.000

(1 row(s) affected)

答案 4 :(得分:0)

SQL Server解决方案作为用户定义的函数。将不仅围绕最近的星期五,而是最近的任何工作日(1-7)指定:

.section{
    position:relative;
    height:200px;
    width:400px;
    background-color:blue;
}

.tabContent{
    position:absolute;
    bottom:2px;
    left:2px;
    right:2px;
}
.tabContent textarea{
    width:100%;
    height:30px;
    box-sizing:border-box;
    -moz-box-sizing:border-box;
    -webkit-box-sizing:border-box;
}