2013-02-13 164 views
0

我已經在一年中的所有星期在這個網站的代碼如下,我應該填充星期日期,開始日期爲星期六和結束日期爲星期五。當一週結束時,它應該進入下一週的日期。 我怎麼能達到這個請幫助我。顯示整個星期的開始日期爲星期六

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

我不明白你的問題,你期望輸出什麼?你有沒有考慮過使用[日曆表](http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html)而不是複雜的查詢?或者這是爲了填充日曆表? – Pondlife 2013-02-13 17:14:27

回答

0

不是真的知道你是問什麼,但根據您的查詢上面這將給本週的數字,根據上週六是一週的第一天,2013年:

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

我覺得這是怎麼在這裏需要?

第二個編輯:

首先,創建功能:

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 

使用功能:

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

我已經實現了展示週日期,但是它顯示了下週的日期,我想展示當前的週日期。 – john 2013-02-14 06:45:28

+0

請參閱上述編輯。如果這仍然不正確,你*真的需要發佈你需要輸出的特定輸出。 – 2013-02-14 10:52:38

+0

最後的代碼很有幫助,但是如何通過功能來實現 – john 2013-02-15 07:17:36

0

我已經實現了,以顯示星期日期,但它顯示下週我希望展示當前週日期,這裏的開始日是星期六和結束日星期五

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 
相關問題