2017-02-15 1 views
0

날짜를 추가하려면 30 일을 가정 해 봅시다. 그러나 30 일은 달력 일 수 없으며, 이는 뒤에있는 논리에 의존하는 매개 변수이므로 필요합니다. 예를 들어 월요일과 수요일 사이에 날짜를 추가하는 방법을 찾으십시오. 2 월 15 일에 30 일 (월간)을 추가하면 4 월 26 일을 받아야합니다. 2 월 2 일에 30 일 (금)을 추가하면 15 일에, 나는 3 월 17 일을 가져야한다.SQL 서버 DATEADD 특정 요일

상황이 충분하지 않아서 개미를 알게되면 나는 더 나은 설명을하려고 노력할 것이다.

감사합니다.

+0

근무일을 의미합니까? – McNets

+0

@McNets 잘, 일이지만, 평일뿐만 아니라, 일요일부터 금요일까지 월요일에서 화요일까지 가능할 수 있습니다 ... 그것은 많이 다릅니다. 그러나 각 쿼리에서 근무일로 필요한 일을 정의 할 수있는 방법이 있다면, 다음과 같이 할 수 있습니다. 그것과 함께 작동 – rhernandez

+0

당신은 조회 달력 테이블이 있습니까? – McNets

답변

1

먼저 활성 플래그를 수정하려면 나는 STARTDATE와 종료 날짜 사이의 날짜의 일련의 생성했지만, 그것은 요일을 반환

SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr 
     FROM  sys.columns c 
     )nbrs 
WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 

그런 다음 당신이 사용할 수있는 간단한 WHERE IN()을 사용하여 포함 할 요일을 선택하고 반환 된 요일을 계산합니다. SQL 서버의 주 전나무 일의

DECLARE @StartDate DATE = '20170101' 
     , @EndDate DATE = '20170131' 

SELECT COUNT(*) AS DAYS 
FROM (
     SELECT DATEPART(weekday, DATEADD(DAY, nbr - 1, @StartDate)) as dow 
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr 
       FROM  sys.columns c 
       )nbrs 
     WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
    ) T1 
WHERE DOW IN (3,4,5); 

테이크 관리, 당신은 SET DATEFIRST로 변경할 수 있습니다.

여기를 확인하십시오 : http://rextester.com/WCLIXM28868

+0

멋지 네요! 그것을 시도하고 알려 드리겠습니다! – rhernandez

+0

굉장! 이게 내가 찾고 있던 바로 그거야. 빠르고 이해하기 쉽다. 고맙습니다! – rhernandez

+0

도와 드릴 수있어서 기쁩니다. – McNets

1

이 같은 재귀 CTE, 함께 할 것입니다 :

-- set datefirst as Sunday. You may need to adjust it ot the correct Datefirst value for your locale 
SET DATEFIRST 7 

declare @d datetime 
set @d = '2017-02-15' 
SELECT @d 

;with 
days as( 
-- this CTE where you define the active days. The days start 
select 1 as d, 0 as active -- sunday 
union 
select 2 as d, 1 as active -- monday 
union 
select 3 as d, 1 as active 
union 
select 4 as d, 1 as active 
union 
select 5 as d, 0 as active 
union 
select 6 as d, 0 as active 
union 
select 7 as d, 0 as active -- saturday 

), 
n as (
select CASE WHEN DATEPART(dw, DATEADD(d, 1, @d)) IN (select d from days where active=1) THEN 1 ELSE 0 END as n, @d as dt 
union all 
select CASE WHEN DATEPART(dw, DATEADD(d, 1, dt)) IN (select d from days where active=1) THEN n+1 else n end, DATEADD(d, 1, dt) 
from n where n < 30) 
--SELECT * from n order by n 
SELECT top 1 @d = dt from n order by n desc 

select @d 

위의 쿼리는 월 - 수요일입니다. 이 일 금요일은 일 CTE

+0

이것이 효과가있을 수 있습니다. CTE에서 사례를 사용할 수있는 일 (0 = 일요일, 7 = 토요일)을 얻은 이후로이 방법을 시도해 보겠습니다. 고맙습니다! – rhernandez

+0

잘 작동하지만 생산 속도가 느릴 수도 있습니다. – rhernandez