2016-03-31 13 views
2

週番号を取得する必要があります。例えば、2016年1月のためにそれのようなものでなければなりません:SQLサーバー:ISOWKパラメータのDATEPARTを使用して、週の最初の曜日に変更してください。

[Week Number] 
53    <--- for dates from Jan 1 to Jan 2 
1    <--- for dates from Jan 3 to Jan 9 
2    <--- for dates from Jan 10 to Jan 16 
...   <--- etc. 

見ての通り、一週間は日曜日から開始する必要があります。週番号を取得するために

SET DATEFIRST 7 

そして、このいずれかを:私は一日の始まりに設定するには、以下の機能を使用しました

DATEPART(ISOWK, SOME_DATE) 

をしかし、私はISOWKが使用されたときにDATEFIRSTが結果に影響しないことに気付きました - 週は常に月曜日から始まります。

だから、私は間違って何をやっていますか?ありがとうございました!

UPD:

私は機能を作ったが、それは良い作品と思われる:

CREATE FUNCTION [dbo].[GetWeekNumber] 
( 
    @date as DATETIME, 
    @offset as INT 
) 
RETURNS NVARCHAR(100) 
    BEGIN 
     DECLARE @weekNumber as int 
     DECLARE @year as int 

     SET @date = DATEADD(MINUTE, @offset, @date) 
     SET @year = DATEPART(year, DATEADD(DAY, 1 - DATEPART(WEEKDAY, @date), CAST(@date AS DATE))) 

     IF @@DATEFIRST = 7 
      BEGIN 
       SET @date = DATEADD(day, 1, @date) 
      END 
     SET @weekNumber = DATEPART(ISO_WEEK, @date) 
     RETURN concat(@year, ', Week ', right('0' + convert(nvarchar, @weekNumber), 2)) 
    END 

あなたは(分単位)オフセット日付とタイムゾーンを渡す必要があります。この機能を実行する前に(0120-919-)(1 - 月曜日、7 - 日曜日)。例:

DECLARE @date as DATETIME 
SET @date = '2016-01-03 12:00' 

SET DATEFIRST 1 
SELECT dbo.GetWeekNumber(@date, 0) -- 2015, Week 53 

SET DATEFIRST 7 
SELECT dbo.GetWeekNumber(@date, 0) -- 2016, Week 01 

答えて

3

これは仕様です。 MSDNによると:

ISO 8601は、ISO週日付システム、 週間のナンバリングシステムを含んでいます。毎週木曜日に発生する年に関連付けられています。例えば、2004年の第1週(2004W01)は 2003年12月29日月曜日から日曜日まで走った 、1月4日2004年

にそうISOWKは常に木曜日に基づいており、かつDATEFIRSTの影響を受けません。

結果を得るには、ISOWKの代わりにWEEKを使用してください。

UPDATE:また、MSDNから:

任意の年の1月1日には、例えば、週 日付要素の開始番号を定義します。DATEPART(週、 '1月1日、XXXX')= 1、XXXX任意の年は です。

第1週を1月3日から9日にする唯一の方法は、数学を使用することです。 DATEPART(wk...)の値から1を減算し、結果が0の場合は53にします(または、週に減算する場合はDATEADDを使用します)。より簡単な方法はありません。設計どおり、1年目の最初の週はJan 1を含む週になります。

+0

私はWEEKも試しました.DATEFIRSTで正しく動作しますが、必要ではありませんたとえば、「Jan 1」の週番号は「1」になりますが、上記のように番号付けが必要です:Jan 1,2 - > Week 53、Jan 3 ... 9 - > Week 1、Jan 10 ... 16 - > 2週 –

+0

私の答えを更新します。 –

+0

ありがとうございました!私は日に日を追加するだけでうまくいくことがわかりました。私の答えが更新されたので、関数と例を見ることができます。 –

関連する問題