2017-11-08 1 views
1

이 SQL 문을 사용하면 적절한 격주 기간을 추가하기에 충분하지 않습니다. 이것은 내가 불완전/잘못이다, 지금 가지고있는 것입니다테이블에 일주일에 격주 기간을 추가하는 방법은 무엇입니까? (SQL Server)

Column 1 (period)/Column 2 (start period)/Column 3 (end period) 
20160115/2016-01-01/2016-01-15 
20160131/2016-01-15/2016-01-31 
20160215/2016-02-01/2016-02-15 
20160229/2016-02-16/2016-02-29 

등등 ...

: 는 내가 원하는 것은이 같은 것입니다. 값이 테이블 열에 올바르게 삽입되고 있지만 월에 같은 일수가 없으므로 간격이 잘못되었습니다

나를 도와 줄 수 있습니까? 고마워요!

DECLARE @d date= '20020101' 
WHILE @d<'20030101' 
    BEGIN 
     INSERT INTO [TABLE] 
     VALUES ((SELECT CONVERT(VARCHAR(8), @d, 112) AS [YYYYMMDD]), @d, @d, 'Fechado', '1') 
     SET @d=DATEADD(DAY,15,@d) 
    END 
+1

이 야해 +14을? –

답변

0

dateadd() 사용하여 일부 날짜 수학 두 쿼리에 대한 애드혹 번호 테이블 common table expressionunion all를 사용하여 :

declare @startdate date = '2016-01-01' 
declare @enddate date = '2016-12-31' 

;with cte as (
select top (datediff(month,@startdate,@enddate)+1) 
    Month = convert(date,dateadd(month,row_number() over (order by (select 1))-1,@startdate)) 
from master..spt_values 
order by month 
) 
select 
    Period = convert(char(8), dateadd(day,14,month), 112) 
    , PeriodStart = month 
    , PeriodEnd = dateadd(day,14,month) 
from cte 
union all 
select 
    Period = convert(char(8), eomonth(month), 112) 
    , PeriodStart = dateadd(day,14,month) 
    , PeriodEnd = eomonth(month) 
from cte 
order by period 

rextester 데모 : http://rextester.com/BSYIXW7864

반환 :

+----------+-------------+------------+ 
| Period | PeriodStart | PeriodEnd | 
+----------+-------------+------------+ 
| 20160115 | 2016-01-01 | 2016-01-15 | 
| 20160131 | 2016-01-15 | 2016-01-31 | 
| 20160215 | 2016-02-01 | 2016-02-15 | 
| 20160229 | 2016-02-15 | 2016-02-29 | 
| 20160315 | 2016-03-01 | 2016-03-15 | 
| 20160331 | 2016-03-15 | 2016-03-31 | 
| 20160415 | 2016-04-01 | 2016-04-15 | 
| 20160430 | 2016-04-15 | 2016-04-30 | 
| 20160515 | 2016-05-01 | 2016-05-15 | 
| 20160531 | 2016-05-15 | 2016-05-31 | 
| 20160615 | 2016-06-01 | 2016-06-15 | 
| 20160630 | 2016-06-15 | 2016-06-30 | 
| 20160715 | 2016-07-01 | 2016-07-15 | 
| 20160731 | 2016-07-15 | 2016-07-31 | 
| 20160815 | 2016-08-01 | 2016-08-15 | 
| 20160831 | 2016-08-15 | 2016-08-31 | 
| 20160915 | 2016-09-01 | 2016-09-15 | 
| 20160930 | 2016-09-15 | 2016-09-30 | 
| 20161015 | 2016-10-01 | 2016-10-15 | 
| 20161031 | 2016-10-15 | 2016-10-31 | 
| 20161115 | 2016-11-01 | 2016-11-15 | 
| 20161130 | 2016-11-15 | 2016-11-30 | 
| 20161215 | 2016-12-01 | 2016-12-15 | 
| 20161231 | 2016-12-15 | 2016-12-31 | 
+----------+-------------+------------+ 
+1

격주로 다른 정의가있는 것 같습니다. :(2 주일이지만 처음 15 일간 나머지는 어떻게 되나요? –

+0

@JuanCarlosOropeza 차이점을 이해하지만 _semi-monthly_를 나타내는 질문의 시작 부분에서 원하는 결과를 얻지 못했습니다. – SqlZim

+0

내 호언 장담은 언어 장벽에 더 가깝다. 나는 반월마다 이해할 수 있고 OP가 원하는 것 같다. –

0

만들기 함수, 다음 쿼리에서 호출

기능 :

create FUNCTION advance_biweekly 
(
    @current date 
) 
RETURNS date 
AS 
BEGIN 
    --if it's the first day of month, advance two weeks 
    if (DAY(@current) = 1) 
     return DATEADD(WEEK, 2, @current) 
    else 
    --if its last day of month, advance one day 
    if (DAY(DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, @current) + 1, 0))) = DAY(@current)) 
     return DATEADD(DAY, 1, @current) 
    else 
    --else, it's the middle of the month, go to end 
     return dateadd(month,((YEAR(@current)-1900)*12)+MONTH(@current)-1,DAY(DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, @current) + 1, 0)))-1) 

    return null 

END 
GO 

코드 :

DECLARE @d date= '20020101' 
WHILE @d<'20030101' 
begin 
    set @d = dbo.advance_biweekly(@d) 
    print @d 
end 

결과 :

2002-01-15 
2002-01-31 
2002-02-01 
2002-02-15 
2002-02-28 
2002-03-01 
2002-03-15 
2002-03-31 
2002-04-01 
2002-04-15 
2002-04-30 
2002-05-01 
+0

고마워요. 다른 솔루션이 나에게 더 쉽다는 것을 알았습니다. 저는 여전히이 논리를 다른 기능에 사용했습니다! –

관련 문제