0

次のように、このサイトで 1 年間のすべての週のコードを取得しました。開始日を土曜日、終了日を金曜日として、週の日付を入力する必要があります。週が終了すると、日付とともに次の週に入る必要があります。どうすればこれを達成できますか。助けてください。

   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];
4

2 に答える 2

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
于 2013-02-14T06:50:26.570 に答える
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

結果は次のとおりです。

ここに画像の説明を入力

これがここで必要なものだと思いますか?

2番目の編集:

まず、関数を作成します。

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
于 2013-02-13T14:24:09.190 に答える