2013-02-13 3 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

ответ

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; 

Edit:

так на основе различных комментариев и ответов я думаю что требуется здесь есть, на данный день, возвращаются все дни в той же неделе, с субботы, как в первый день недели. Так что-то вроде этого:

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

+0

См. Приведенные выше изменения. Если это по-прежнему не правильно, вы действительно хотите опубликовать, какой вывод вы требуете для определенного ввода. –

+0

Последний код полезен, но как его можно достичь с помощью функции – john

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 
Смежные вопросы