2010-03-01 3 views

답변

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 
+0

나에게 같습니다 SET의 NOCOUNT을 SET ON DATEFIRST 2 선언 @DateValue 날짜 시간 SET @DateValue = '2010년 1월 1일' @DateValue 동안 < '2011년 2월 1일' ( SET @DateValue = @DateValue + 1 END –

+0

나는이 위에서 언급 한 바와 같이이 잘 작동하고 가장 가까운 금요일 "라운드"가 - PRINT DateAdd 함수 (DATEPART (DW, @DateValue), @DateValue 일, 4) BEGIN 또는 아래로) 변경해야하지만 다음과 같이 변경해야합니다. ... SET DATEFIRST 3 ... PRINT DateAdd (일, 4 - DatePart ... –

2

이 미래에 가장 가까운 금요일 반환

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

2010 년 1 월 1 일자 날짜 리터럴의 사용법을 설명 할 수 있습니까? 그것은 임의적입니까, 아니면 주기적으로 업데이트해야합니까? –

+0

루프에서 날짜 범위에 대해이 항목을 실행했는데 다음 금요일 (가장 가까운 날짜)이 아닌 –

+0

을 반환한다고 생각합니다. 2010-03-01 (오늘)에 실행하면 2010- 03-05 가장 가까운 것은 아니지만 2010-2-26입니다. –

0

,이 시도 :

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


SET @StartDate='2010-3-1'---<<<given date, Monday, closest should be '2010-2-26' 
SET @[email protected]+8 
SET @[email protected] 
;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) 
2

트릭은 얼마나 많은 일 거리를 결정하는 것입니다 가장 가까운 금요일은 제안 된 날짜입니다.

일요일 -2
월요일 -3
화요일 3
수요일 2
목요일 1
금요일 0
토요일 : 전체 주에 떨어진 가장 가까운에서 일수를 보면, 금요일을 돕기 위해 -1

이제 이러한 결과를 반환하는 수식이 필요합니다. 일요일과 월요일은 다른 요일과 다른 패턴을 따르기 때문에 두 가지 수식이 필요합니다.

첫째, 여기는 일요일과 월요일입니다. 요일 값에 1을 더한 다음에 음수를 취하여 날짜에 적용합니다. 예를 들어, Monday는 요일 값으로 2의 기본값을가집니다. (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 
+0

T 그의 대답은 훌륭한 대답이다. 설명과 해결책에 감사한다. – dougajmcdonald

0

SQL Server 솔루션은 사용자 정의 함수입니다. 가장 가까운 금요일뿐만 아니라 평일 (1-7) 중 가장 가까운 날짜로 반올림합니다.

CREATE FUNCTION RoundToNearestWeekday (
--Give this function a date, and the number of the weekday you want to round to the nearest of 
    @DateInput date, --Date you want to round 
    @ToWeekdayNumber tinyint --1 = round to nearest Sunday, 2 = round to nearest Monday, etc. 
) 
RETURNS date 
AS 
    BEGIN 
     DECLARE @Offset tinyint, @LowNumber smallint, @HighNumber smallint, @NewDate date 
     SET @Offset = (@ToWeekdayNumber + 3)%7 
     SET @LowNumber = @Offset-3 
     SET @HighNumber = @Offset+4 
     SET @NewDate = dateadd(day,CASE WHEN datepart(weekday,@DateInput) <= @Offset THEN @LowNumber ELSE @HighNumber END - datepart(weekday,@DateInput),@DateInput) 
     RETURN @NewDate 
    END 
관련 문제