5

私は試しましたが、正しい解決策を得ることができませんでした。今年のすべての週末の日付を一覧表示するSQLクエリが必要です。

私はこのSQLクエリを試しました:

WITH hier(num, lvl) AS (
    SELECT  0, 1
            UNION ALL
    SELECT  100, 1
            UNION ALL 
    SELECT  num + 1, lvl + 1
    FROM    hier
    WHERE   lvl < 100 
)
SELECT lvl [Week], 
convert(date,DATEADD(dw, -DATEPART(dw, DATEADD(wk,DATEDIFF(wk,0,'12/31/'+convert(nvarchar,YEAR(getdate()))), 0)+6 ),
DATEADD(wk, DATEDIFF(wk,0,'12/31/'+convert(nvarchar,YEAR(getdate()))), 0)+6 ) - num  * 7,101) [End Date]
FROM    hier a
where   num < 52
ORDER BY [End Date] asc

その出力は次のようになります。

Week  End date
52  2012-01-14
51  2012-01-21
50  2012-01-28
49  2012-02-04

日付を最初から始めたいので、上記はある週末、つまり。が欠落してい2012-07-01ます。1, 2, 3...また、週番号をの代わりに表示したい52, 51...

4

9 に答える 9

6

このブログ投稿をチェックしてください。

あなたの質問は詳細に説明されています。

DECLARE @Year AS INT,
@FirstDateOfYear DATETIME,
@LastDateOfYear DATETIME
-- You can change @year to any year you desire
SELECT @year = 2010
SELECT @FirstDateOfYear = DATEADD(yyyy, @Year - 1900, 0)
SELECT @LastDateOfYear = DATEADD(yyyy, @Year - 1900 + 1, 0)
-- Creating Query to Prepare Year Data
;WITH cte AS (
SELECT 1 AS DayID,
@FirstDateOfYear AS FromDate,
DATENAME(dw, @FirstDateOfYear) AS Dayname
UNION ALL
SELECT cte.DayID + 1 AS DayID,
DATEADD(d, 1 ,cte.FromDate),
DATENAME(dw, DATEADD(d, 1 ,cte.FromDate)) AS Dayname
FROM cte
WHERE DATEADD(d,1,cte.FromDate) < @LastDateOfYear
)
SELECT FromDate AS Date, Dayname
FROM CTE
WHERE DayName LIKE 'Sunday'
/*
WHERE DayName IN ('Saturday,Sunday') -- For Weekend
WHERE DayName NOT IN ('Saturday','Sunday') -- For Weekday
WHERE DayName LIKE 'Monday' -- For Monday
WHERE DayName LIKE 'Sunday' -- For Sunday
*/
OPTION (MaxRecursion 370)
于 2012-09-19T06:34:25.527 に答える
4

これは役に立ちますか

DECLARE @startDate DATETIME, @endDate DATETIME
SELECT @startDate = '2012-01-01', @endDate = '2012-12-31'
;WITH Calender AS (
    SELECT @startDate AS dt
    UNION ALL
    SELECT dt + 1 FROM Calender
    WHERE dt + 1 <= @endDate
)
SELECT 
dt
,NameMonth = DATENAME(Month, dt)
,NameDay = DATENAME (Weekday,dt)
,WeekofYr = DATEPART(WEEK, dt)  FROM Calender
WHERE DATENAME (Weekday,dt) IN ('Sunday')
Option(MaxRecursion 0)

結果(一部)

dt                      NameMonth   NameDay WeekofYr
2012-01-01 00:00:00.000 January     Sunday  1
2012-01-08 00:00:00.000 January     Sunday  2
...............................................
...............................................
2012-12-30 00:00:00.000 December    Sunday  53    
于 2012-09-19T06:40:53.763 に答える
2

あなたはこれを試すことができます

DECLARE @FirstDateOfYear DATETIME
SET @FirstDateOfYear = ’2010-01-01′
SELECT DISTINCT DATEADD(d, number, @FirstDateOfYear),
CASE DATEPART(dw, DATEADD(d, number, @FirstDateOfYear))
WHEN 7 THEN ‘Saturday’
WHEN 1 THEN ‘Sunday’
ELSE ‘Work Day’
END
FROM master..spt_values
WHERE number BETWEEN 0 AND 364
AND (DATEPART(dw, DATEADD(d, number, @FirstDateOfYear)) = 1 OR DATEPART(dw, DATEADD(d, number, @FirstDateOfYear)) = 7)
ORDER BY DATEADD(d, number, @FirstDateOfYear)
于 2012-09-19T06:37:42.727 に答える
0

これも機能します

declare @dat datetime, @add int

set @dat = '20120101'
set @add = datepart(w,@dat)

set @add = 5 - @add -- friday

set @dat = dateadd(d,@add,@dat)

while @dat <= '20121231'
begin
    print @dat
    set @dat = dateadd(d,7,@dat)
end 
于 2012-09-19T06:41:38.107 に答える
0

これを実行して、最初の土曜日を見つけてください。

  1. 2012-01-01に開始
  2. 土曜日でない場合は、1日追加します
  3. 後藤2

次に、一時テーブルに、その日付と次の日付(日曜日)を追加します。その後、以下をループします。

  1. 見つけた最後の土曜日に7日と8日を追加します(次の土曜日と日曜日を取得します)
  2. 彼らがまだ2012年にあるかどうかを確認してください
  3. もしそうなら、それらを一時テーブルに保存し、1に移動します

もっとエレガントな方法があるかもしれませんが、それは私の迅速で汚い解決策です。試したことのコードを投稿しなかったので、実装はあなたに任せます。

于 2012-09-19T06:31:54.487 に答える
0

このクエリは、最初の部分で今年の最初の日と来年の最初の日を取得する方法を示しています。年の部分を取得して比較し続けることがないように、翌年の最初の日は 1 回計算されます。

;WITH cte(TheDate,NextYear) AS
(
  SELECT CAST(CONVERT(CHAR(4),GETDATE(),112)+'0101' AS DATETIME),
         CAST(YEAR(GETDATE())*10000+10101 AS CHAR(8))
   UNION ALL
  SELECT DateAdd(d,1,TheDate),NextYear
    FROM cte
   WHERE DateAdd(d,1,TheDate)<NextYear
)
  SELECT Week = DatePart(wk,TheDate),
         TheDate
    FROM cte
   WHERE DateName(dw,TheDate) in ('Saturday')
ORDER BY TheDate
OPTION (MAXRECURSION 366)
于 2012-09-19T06:58:57.633 に答える
0
with t as 
(
select 1 b
union all
select 1 b
union all
select 1 b
union all
select 1 b
union all
select 1 b
union all
select 1 b
union all
select 1 b
union all
select 1 b
) 
select * from 
(
select 
current_timestamp
-datepart(dy,current_timestamp)
+row_number() over (order by t.b) d
from t, t t1, t t2 
) tmp 
where datepart(yyyy,d)=datepart(yyyy,current_timestamp)
      and
      DATENAME(dw,d)='sunday'
于 2012-09-19T07:05:34.300 に答える
0
;with AllDaysOfYear (Day) as (
    select DATEADD(year,DATEDIFF(year,0,CURRENT_TIMESTAMP),0) --Jan 1st
    union all
    select DATEADD(day,1,Day) from AllDaysOfYear
    where DATEPART(year,DATEADD(day,1,Day)) = DATEPART(year,CURRENT_TIMESTAMP)
)
select
    ROW_NUMBER() OVER (ORDER BY Day) as WeekNo,
    Day
from
    AllDaysOfYear
where
    DATEPART(weekday,Day) = DATEPART(weekday,'20120714')
option (maxrecursion 0)

まず、今年のすべての日のセットを生成します ( AllDaysInYear)。次に、weekday土曜日を選択します。私が使用した値 ( '20120714') はそれほど重要ではありません。任意の年の任意の土曜日でなければなりません。特定DATEFIRSTの設定や言語設定が不要になるように使用しています。

于 2012-09-19T06:48:39.387 に答える