2013-02-13 2 views
0

다음과 같이 1 주일 동안이 사이트에서 코드를 얻었습니다. 주일을 채우고 금요일과 토요일로 시작 날짜를 기입해야합니다. 일주일이 끝나면 다음 주에 날짜를 입력해야합니다. 어떻게하면이 도움을 얻을 수 있습니까? 2013 년 토요일은 주일의 첫날 인에 따라 주 번호를 줄 것이다 정말 당신이 요구하는지 모르겠지만,이 위의 쿼리를 기반으로토요일로 전체 주간 시작일을 표시합니다.

DECLARE @Year INT=2013; 
    DECLARE @start DATE; 
--DECLARE @WK INT=2 
SET @start = DATEADD(YEAR, @Year-1900, 0); 

    ;WITH n AS 
    ( 
    SELECT TOP (366) -- in case of leap year 
    TDate = DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY name)-1, @start) 
    FROM sys.all_objects   
), 
    x AS 
    ( 
    SELECT md = MIN(TDate) FROM n 
    WHERE DATEPART(WEEKDAY, TDate) = 7 -- assuming DATEFIRST is SATURDAY 
), 
    y(TDate,wk) AS 
    ( 
    SELECT n.TDate, ((DATEPART(DAYOFYEAR,n.TDate)-           
    DATEDIFF(DAY, @start,x.md)-1)/7)+1 
    FROM n CROSS JOIN x 
    WHERE n.TDate >= x.md 
    AND n.TDate < DATEADD(YEAR, 1, @start) 
) 
    SELECT [date] = TDate, [week] = wk 
    FROM y WHERE wk < 53 
    ORDER BY [date]; 
+0

귀하의 질문에 대한 이해가되지 않습니다. 결과물은 무엇입니까? 그리고 복잡한 쿼리 대신 [calendar table] (http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html)을 사용해 보셨습니까? 아니면 이것은 달력 표를 채우기위한 것입니까? – Pondlife

답변

0

되지 않음 :

DECLARE @Year INT=2013; 
DECLARE @start DATE; 

SET @start = DATEADD(YEAR, @Year-1900, 0); 

SET DATEFIRST 6; -- Set start of week as Saturday 

WITH n AS 
( 
SELECT TOP (366) -- in case of leap year 
TDate = DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY name)-1, @start) 
FROM sys.all_objects   
) 
select TDate 
    , DATEPART(WEEK,TDate) 
from n 
where year(TDate) = 2013; 

편집 :

은 그래서 다양한 의견과 나는 주어진 일을 위해, 여기에 필요한 사항을 생각 주일의 첫날 토요일에, 같은 주에 모든 일 반환 응답에 따라. 그래서 이런 식으로 뭔가 : 결과를 제공

set datefirst 6; -- make sure first day of week is Saturday 

declare @date date = getdate(); -- change date as required here 

with daysOfWeek as 
(
    select [date] = dateadd(dd, -datepart(dw, @date) + 1, @date) 
    union all 
    select [date] = dateadd(dd, 1, [date]) 
    from daysOfWeek 
    where [date] < dateadd(dd, -datepart(dw, @date) + 7, @date) 
) 
select [date], dayOfWeek = datename(dw, [date]) 
from daysOfWeek 

:

enter image description here

내가이 여기에 필요한 무슨 생각?

번째 편집 :

먼저, 함수 생성 : I가 WEEK 날짜를 표시 달성하지만이를 표시

set datefirst 6 -- Set Saturday as first day of week 
select * from dbo.weekDates (getdate()) -- Change input parameter as required 
+0

나는 주간을 표시하기로했다. 그러나 나는 현재 주일을 보여주고있다. – john

+0

위의 수정 사항을 참조하십시오. 여전히 올바르지 않은 경우 특정 입력에 필요한 출력을 게시해야합니다. –

+0

마지막 코드가 유용하지만 기능을 통해 어떻게 달성 할 수 있습니까? – john

0

: 함수를 사용

create function dbo.weekDates (@date date) 
returns @dates table ([date] date, [dayofweek] varchar(9)) 
as 
begin 

    with daysOfWeek as 
    (
    select [date] = dateadd(dd, -datepart(dw, @date) + 1, @date) 
    union all 
    select [date] = dateadd(dd, 1, [date]) 
    from daysOfWeek 
    where [date] < dateadd(dd, -datepart(dw, @date) + 7, @date) 
) 
    insert into @dates ([date], [dayofweek]) 
    select [date], [dayOfWeek] = datename(dw, [date]) 
    from daysOfWeek; 

    return 

end 

go 

을 다음주의 요일 현재 요일을 표시하고 싶습니다. 시작일은 오늘 토요일이고 마지막 날은 금요일입니다

ALTER FUNCTION GetCurrentWeek() 
    RETURNS @TWeek TABLE (TWeek NVARCHAR(20)) 
    AS 
    BEGIN 
    DECLARE @Year INT= DATEPART(YEAR,GETDATE()); 
    DECLARE @start DATE; 
    SET @start = DATEADD(YEAR, @Year-1900, 0); 

    ;WITH n AS 
    (
    SELECT TOP (366) -- in case of leap year 
    TDate = DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY name)-1, @start) 
    FROM sys.all_objects 
    ), 
    x AS 
    (
    SELECT md = MIN(TDate) FROM n 
    WHERE DATEPART(WEEKDAY, TDate) = 7 -- assuming DATEFIRST is SATURDAY 
    ), 
    y(TDate,wk) AS 
    (
    SELECT n.TDate, ((DATEPART(DAYOFYEAR, n.TDate) 
    - DATEDIFF(DAY, @start, x.md)-1)/7) + 1 
    FROM n CROSS JOIN x 
    WHERE n.TDate >= x.md 
    AND n.TDate < DATEADD(YEAR, 1, @start) 
) 
    INSERT @TWeek 
    SELECT [date] = TDate 
    FROM y WHERE wk =DATEPART(wk, GetDate()) 
    ORDER BY [date]; 
    RETURN; 

    END 
관련 문제